算法通关村——二叉树里的双指针

1.1 判断两颗树是否相同

LeetCode100:给定一个函数来判断两颗树是否相同,如果两棵树的结构相同并且相同结点的值一样,则说明两棵树相同。

实例如下:

上一章节我们学会了递归方式的二叉树的前序遍历,这里只要添加个结点判断条件,即可完成该题目。

判断结点相等条件有两个个:

①当两个结点的值为空时,则相等

②当结点的值相等时,则相等

其余情况下,结点都不相等,即两棵树不同

代码如下:

public static boolean isSameTree(TreeNode p, TreeNode q) {
        //如果都为空我们就认为他是相同的
        if (p == null && q == null)
            return true;
        //如果一个为空,一个不为空,很明显不可能是相同的树,直接返回false即可
        if (p == null || q == null)
            return false;
        //如果这两个节点都不为空并且又不相等,所以他也不可能是相同的树,直接返回false
        if (p.val != q.val)
            return false;
        //走到这一步说明节点p和q是完全相同的,我们只需要在比较他们的左右子节点即可
        return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
    }

1.2 对称二叉树

LeetCode101:给定一个树,判断该树是否是对称的

实例如下:

我们可以把一颗数的两个孩子当成子树的两个根节点,这样该问题就可以变成判断两个数是否对称,和上面的题目就很相似了。

和上题不同的是,相同是看同侧,对称是看异侧,分为里侧和外侧。

外侧就是判断左节点的左孩子是否等于右节点的右孩子,

右侧就是判断左节点的右孩子是否等于右节点的左孩子。

代码和上题大差不差,代码如下:

public static boolean isSymmetric(TreeNode root) {
        if (root == null) {
            return true;
        }

        return check(root.left, root.right);
    }

    public static boolean check(TreeNode p, TreeNode q) {
        if (p == null && q == null) {
            return true;
        }
        if (p == null || q == null) {
            return false;
        }
        if (p.val != q.val) {
            return false;
        }
        return check(p.left, q.right) && check(p.right, q.left);
    }

1.3 合并二叉树

LeetCode617:

将两个树的每个结点合并,如果两个结点不为空就相加为新的结点值,如果又一个为空,另一个结点就成为新的结点,如果都为空,则合并的也为空节点

代码如下:

 public static TreeNode mergeTrees(TreeNode t1, TreeNode t2) {
        if (t1 == null) {
            return t2;
        }
        if (t2 == null) {
            return t1;
        }
        TreeNode merged = new TreeNode(t1.val + t2.val);
        merged.left = mergeTrees(t1.left, t2.left);
        merged.right = mergeTrees(t1.right, t2.right);
        return merged;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值