二叉树-- 相同的树
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))
以上仅是个人思路解法,觉得还不错欢迎点赞关注分享
往期精彩推荐
以上是关于二叉树-- 相同的树的主要内容,如果未能解决你的问题,请参考以下文章
数据结构——二叉树的基础练习题(单值二叉树,翻转二叉树,相同的树,对称二叉树,另一颗子树,二叉树的前序遍历)
二叉树有关习题整理 144二叉树的前序遍历 100相同的树 101对称二叉树 110平衡二叉树 958二叉树的完全性检验 662二叉树的最大宽度