Bootstrap

二叉树系列/10.14

一、翻转等价二叉树

们可以为二叉树 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;
    }
}

;