算法总结10|二叉树灵活运用递归|相同 对称 平衡 右视图

1. 相同二叉树

递归左右子树是否相同

终止条件:有一颗树为空---两颗树都为空,返回true否则返回false

class Solution {
    public boolean isSameTree(TreeNode p, TreeNode q) {
        if (p==null || q==null) return p==q;

        return p.val==q.val && isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
    }
}

2.对称二叉树

同上:只是现在判断左子树等于右子树,右子树等于左子树

递归左右子树是否相同

终止条件:有一颗树为空---两颗树都为空,返回true否则返回false

class Solution {
    public boolean isSymmetric(TreeNode root) {
       if (root==null) return true;
       return isSameTree(root.left, root.right);
    }

    //判断两颗子树是否相同
    public boolean isSameTree(TreeNode p, TreeNode q) {
        if (p==null || q==null) return p==q;

        return p.val==q.val && isSameTree(p.left, q.right) && isSameTree(p.right, q.left);
    }
}

3.平衡二叉树

左右子树的高度差不为1

递归函数:找左右子树的高度

返回值为int,

如果左右子树高度差大于1,返回-1,将-1传到上面去

如果上面没有接收到-1,返回该子树的高度(max(左子树深度,右子树深度)+1)

class Solution {
    public boolean isBalanced(TreeNode root) {
        return findDepth(root)!=-1;
    }

    public int findDepth(TreeNode root) {
        if (root==null) return 0;

        //递归找左右子树的深度
        int lh=findDepth(root.left);
        if(lh==-1) return -1;  //上一轮左右子树差大于1,传上去,结束
        int rh=findDepth(root.right);
        if(rh==-1) return -1;
        //左右子树的深度差大于1,不平衡
        if(Math.abs((lh-rh))>1) return -1;
        return Math.max(lh, rh)+1;
    }
}

4.二叉树的右视图

 

先递归右子树,再递归左子树

问题:如何把答案记下来?

如何判断该节点需要记录到结论中?---在递归同时维护一个递归深度,如果递归深度等于答案长度,则该节点需要被记录

(先递归右子树,再往左走,往左走的节点其深度小于答案长度时不记录(被右边节点挡住了))

1,3,4记录后,答案长度为3,根节点向左走,节点2,5的深度小于3,不记录

class Solution {
    List<Integer> ans=new ArrayList<Integer>();
    public List<Integer> rightSideView(TreeNode root) {
        df(root, 0);
        return ans;
    }

    public void df(TreeNode root,int depth){
        //终止条件
        if(root==null) return;
        if(depth==ans.size()) ans.add(root.val);
        df(root.right, depth+1);//下一个节点的深度为上一个节点的+1
        df(root.right, depth+1);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值