一、翻转等价二叉树
们可以为二叉树 T 定义一个 翻转操作 ,如下所示:选择任意节点,然后交换它的左子树和右子树。
只要经过一定次数的翻转操作后,能使 X 等于 Y,我们就称二叉树 X 翻转 等价 于二叉树 Y。
这些树由根节点 root1
和 root2
给出。如果两个二叉树是否是翻转 等价 的函数,则返回 true
,否则返回 false
。
思路:
类似于对称二叉树的思路,对称二叉树在递归的时候:是左节点的左子树和右节点的右子树进行比较;然后左节点的右子树和右节点的左子树进行比较;
该题因为不确定是否翻转,所以有两种情况:
没有翻转的话,左节点的左子树和右节点的左子树是相同的;左节点的右子树和右节点的右子树是相同的
翻转的话,左节点的左树和右节点的右子树是相同的;左节点的右子树和右节点的左子树是相同的
代码:
class Solution {
public boolean flipEquiv(TreeNode root1, TreeNode root2) {
return dfs(root1,root2);
}
public boolean dfs(TreeNode left,TreeNode right){
//左右为空才返回
if(left==null||right==null){
return left==null&&right==null;
}
//当左右都不为空的时候
if((left.val!=right.val))return false;
boolean leftFlag=dfs(left.left,right.left)||dfs(left.left,right.right);
boolean rightFlag=dfs(left.right,right.left)||dfs(left.right,right.right);
return leftFlag&&rightFlag;
}
}
二、平衡二叉树:
给你一棵树,判断是否是平衡二叉树。
平衡二叉树:任何节点的左子树和右子树的高度差的绝对值不超过 1。
思路:
对于每一个节点来说,递归获取到左子树的高度;递归获取到右子树的高度;
如果左子树的高度为-1 或者 右子树的高度为-1 证明左子树或者右子树已经不满足平衡二叉树的规则了。
如果都满足,再判断该节点是否满足。
最后 返回左右子数中深度最大的值+1;
代码:
class Solution {
public boolean isBalanced(TreeNode root) {
return getHeight(root)==-1?false:true;
}
public Integer getHeight(TreeNode root){
if(root==null)return 0;
int leftHeight=getHeight(root.left);
int rightHeight=getHeight(root.right);
if(leftHeight==-1)return -1;
if(rightHeight==-1)return -1;
if(Math.abs(leftHeight-rightHeight)>1)return -1;
return Math.max(leftHeight,rightHeight)+1;
}
}