leetCode100 相同的树

相同的树
在leetCode有这样一个题目:

给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
eq:
输入:p = [1,2,3], q = [1,2,3]
输出:true

思路:
经过一会的脑力风暴,发现这题可以用递归,或者非递归的前中序遍历等方式解决。

第一种方法:递归
这种方法只要判断两树的结点有一个层次结构不同就为false,如果层次结构相同,就将根左右各结点每次进行比较判断,都满足则为true,否则为false

  • 流程实例图
    在这里插入图片描述

  • 代码示例

 if (Objects.isNull(p) && Objects.isNull(q)) {
           return true;
       }
       if (Objects.isNull(p)) {
           return false;
       }
       if (Objects.isNull(q)) {
           return false;
       }
           return p.val == q.val
            && isSameTree(p.left, q.left) 
           	&& isSameTree(p.right, q.right);
       }

该方法比较容易理解,无非就是对树的层次结构和根左右结点的值都同时比较满足,最后返回的结果就是答案。

第二种方法 :非递归树的前序遍历
该方法主要结合了二叉树的前序遍历,根左右,即先遍历根结点的当前结点,之后再遍历左子结点,最后在遍历右子结点。

这里先对树的前序遍历和中序遍历和后序遍历作个简单的介绍
在这里插入图片描述
从图我们可以得出所谓的前中后序遍历是针对输出根节点的位置来决定的,输出根节点在前,就是前序遍历,其他两种遍历同理。

最后我们知道树的遍历方式,这题用前序遍历解决就不难了,结合栈的先进后出的特点,将节点存储到栈中,之后进行pop出比较,就可以得出结果。

 public boolean isSameTreePre(TreeNode p, TreeNode q) {
        if (Objects.isNull(p) && Objects.isNull(q))  return true;
        if (Objects.isNull(p)) return false;
        if (Objects.isNull(q))  return false;
           
        Stack<TreeNode> stackP = new Stack<>();
        stackP.add(p);
        Stack<TreeNode> stackQ = new Stack<>();
        stackQ.add(q);
        while (!stackP.isEmpty() || !stackQ.isEmpty()) {
            TreeNode pNode = stackP.pop();
            TreeNode qNode = stackQ.pop();
            if (Objects.isNull(pNode) && Objects.isNull(qNode)) continue;
            if (Objects.isNull(pNode)) return false;
            if (Objects.isNull(qNode)) return false;
            if (!Objects.equals(pNode.val,qNode.val)) {
                return false;
            } else {
                stackP.add(pNode.right);
                stackQ.add(qNode.right);
                stackP.add(pNode.left);
                stackQ.add(qNode.left);
            }
        }
        return true;
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值