#判断二叉树是否对称 #比较二叉树是否相同 #判定两个二叉树是否是包含关系
程序员文章站
2022-05-16 10:10:13
...
这三道题有很多相似之处,这里我们直接贴代码,整理思路过程
#比较二叉树是否相同
- 两棵树都为空,相同
- 有一颗为空,不同
- 都不空,递归去分别看左子树与右子树
class Solution {
public boolean isSameTree(TreeNode p, TreeNode q) {
if(p==null && q==null){
return true;
}
if(p==null || q==null){
return false;
}
return p.val==q.val && isSameTree(p.left,q.left)
&& isSameTree(p.right,q.right);
}
}
#判断一颗二叉树是否对称
- 根节点为空,该二叉树不存在,返回true
- 左右子树不存在,返回true
- 一支子树存在,返回false
- 对称的话左子树的左==右子树的右,左子树的右==右子树的左,所以递归分别去看
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root==null){
return true;
}
return helper(root.left,root.right);
}
public boolean helper(TreeNode root1,TreeNode root2){
if(root1==null && root2==null){
return true;
}
if(root1==null || root2==null){
return false;
}
return root1.val==root2.val && helper(root1.left,root2.right)
&& helper(root1.right,root2.left);
}
}
#判定两个二叉树是否是包含关系
- 两棵树都为空,返回true;
- root不空,subroot为空,肯定包含,返回true;
- root空,subroot不为空,返回false;
- 都不空,两棵树相同
- 都不空,两棵树不相同,则利用递归分别在左子树和右子树中去找
class Solution {
public boolean isSameTree(TreeNode s,TreeNode t){
if (s==null && t == null){
return true;
}
if (s == null || t == null || (s.val != t.val ){
return false;
}
return isSameTree(s.left,t.left) && isSameTree(s.right,t.right);
}
public boolean isSubtree(TreeNode root, TreeNode subRoot) {
if(root==null && subRoot==null){
return true;
}
if(root!=null && subRoot==null){
return true;
}
if(root==null && subRoot!=null){
return false;
}
if(isSameTree( root, subRoot)){
return true;
}
return isSubtree(root.left,subRoot) || isSubtree(root.right,subRoot);
}
}
以上三道题,都是一个递归思想,
像做数学题一样,条例分清楚,按照条例往下写代码,即可