二叉树-- 相同的树

Posted 算法和数据结构

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树-- 相同的树相关的知识,希望对你有一定的参考价值。

来源:LeetCode

难度:简单

描述:

        给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。


示例1:


示例2:

二叉树(十二)-- 相同的树


分析:

        题目给咱们两棵树,让咱们判断这两个树是不是相同。这里的相同指的是一模一样,即首先两棵树的结构要一模一样,并且相同位置的值也要一样。

        对应到二叉树上就是两棵树的根节点的值一样,并且左子树的值和右子树的值也要一样。老规矩,这里分别采用深度和广度两种方法来解


解题

方法一:深度优先遍历

思路:如分析,在遍历的过程中判断两棵树的每个节点。如下

  • 首先如果两个二叉树都为空,则两个二叉树相同。

  • 如果两个二叉树中有且只有一个为空,则两个二叉树一定不相同

  • 如果都不为空,判断两棵树根节点的值是否相同,若不相同则两个二叉树一定不同。若相同,再分别判断两个二叉树的左子树是否相同以及右子树是否相同。

  • 这是一个递归的过程,因此可以使用深度优先搜索,递归地判断两个二叉树是否相同


代码:

 1public boolean isSameTree(TreeNode p, TreeNode q) {
2    //都为空
3    if (p == null && q == null) {
4        return true;
5    }
6    //一方为空
7    if (p == null || q == null) {
8        return false;
9    }
10    //根节点不同
11    if (p.val != q.val) {
12        return false;
13    }
14    //根节点相同,递归判断左右子树
15    return isSameTree(p.left, q.left) & isSameTree(p.right, q.right);
16}

时间复杂度:O(min(m,n))  两棵树,如果不相等,遍历到小的那棵不相等的节点就已经结束遍历了

空间复杂度:O(min(m,n))


方法二:广度优先遍历

思路:和深度思路差不多,广度采用两个队列存放两棵树的节点,在进行比较前需要判断结构节点的结构是否相同,即左节点要等于左节点,右节点要等于右节点,基本步骤如下:

  • 比较两个节点的值,如果两个节点的值不相同则两个二叉树一定不同;

  • 如果两个节点的值相同,则判断两个节点的子节点是否为空,如果只有一个节点的左子节点为空,或者只有一个节点的右子节点为空,则两个二叉树的结构不同,因此两个二叉树一定不同;

  • 如果两个节点的子节点的结构相同,则将两个节点的非空子节点分别加入两个队列,子节点加入队列时需要注意顺序,如果左右子节点都不为空,则先加入左子节点,后加入右子节点。

  • 最后需要判断队列是否同时为空,防止某棵树多出来一截


代码:

 1public boolean isSameTree(TreeNode p, TreeNode q) {
2    if (p == null && q == null) {
3        return true;
4    } else if (p == null || q == null) {
5        return false;
6    }
7    Queue<TreeNode> queue1 = new LinkedList<TreeNode>();
8    Queue<TreeNode> queue2 = new LinkedList<TreeNode>();
9    queue1.add(p);
10    queue2.add(q);
11    while (!queue1.isEmpty() && !queue2.isEmpty()) {
12        TreeNode node1 = queue1.poll();
13        TreeNode node2 = queue2.poll();
14        //节点值不为相等
15        if (node1.val != node2.val) {
16            return false;
17        }
18        TreeNode left1 = node1.left, right1 = node1.right;
19        TreeNode left2 = node2.left, right2 = node2.right;
20        if (left1 == null ^ left2 == null) {
21            //两个左节点只有一个为空
22            return false;
23        }
24        if (right1 == null ^ right2 == null) {
25            //两个右节点只有一个为空
26            return false;
27        }
28        if (left1 != null) {
29            queue1.add(left1);
30        }
31        if (right1 != null) {
32            queue1.add(right1);
33        }
34        //入队顺序需保持一致,先左后右
35        if (left2 != null) {
36            queue2.add(left2);
37        }
38        if (right2 != null) {
39            queue2.add(right2);
40        }
41    }
42    //必须两个队列同时为空才表示两棵树完全相同
43    return queue1.isEmpty() && queue2.isEmpty();
44}

时间复杂度:O(min(m,n)

空间复杂度:O(min(m,n))


以上仅是个人思路解法,觉得还不错欢迎点赞关注分享


往期精彩推荐



扫描下方二维码,关注公众号,更多精彩等你发现


以上是关于二叉树-- 相同的树的主要内容,如果未能解决你的问题,请参考以下文章

二叉树-- 相同的树

数据结构二叉树经典基础习题

数据结构——二叉树的基础练习题(单值二叉树,翻转二叉树,相同的树,对称二叉树,另一颗子树,二叉树的前序遍历)

二叉树练习题1-相同的树

二叉树有关习题整理 144二叉树的前序遍历 100相同的树 101对称二叉树 110平衡二叉树 958二叉树的完全性检验 662二叉树的最大宽度

二叉树模板套题——相同的树的应用