LeetCode题解 之 相同的树

【LeetCode题解】 100. 相同的树

Hi,大家好,又到了每周一的LeetCode时间了。本周给打架带来的是一道关于树结构的题——相同的树。该题是一道难度为简单的题目,考察的是对树结构进行遍历的理解。

描述

给定两个二叉树,编写一个函数来检验它们是否相同。

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

示例

示例1:

输入:
[1,2,3]
[1,2,3]

输出:
true

图解:
  1      1
 / \    / \
2   3  2   3

示例2:

输入:
[1,2]
[1,null,2]

输出:
false

图解:
  1      1
 /        \
2          2

示例3:

输入:
[1,2,1]
[1,1,2]

输出:
false

图解:
  1      1
 / \    / \
2   1  1   2

解法一

比较容易想到且实现的一种解法就是利用递归进行实现。每次调用IsSameTree方法时判断当前两个结点是否相同(需要处理为空的情况),若二者的值不同则不为相同的树;若二者的值相同,则通过IsSameTree方法对子结点继续进行判断。

public bool IsSameTree(TreeNode p, TreeNode q) {
    if (p == null && q == null)
    {
        return true;
    }
    else if (p == null || q == null)
    {
        return false;
    }

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

递归法对每个结点只访问一次,时间复杂度为O(N),且不需要辅助的内存空间,但需要额外的函数调用开销。

解法二

同样,我们也可以使用迭代的方法实现该题。在对树使用迭代法进行遍历时,需要使用额外的辅助空间存放尚未遍历到的结点,这里我们使用了两个队列做这个工作。

在开始时,要先把树的根结点入队。在每次迭代的过程中需要判断当前结点的值是否相同(同样也要处理为空的情况),若二者的值不同则不是相同的树;若二者的值相同则将子结点入队,继续进行下一轮迭代。

public bool IsSameTree(TreeNode p, TreeNode q) {
    Queue<TreeNode> pQueue = new Queue<TreeNode>();
    Queue<TreeNode> qQueue = new Queue<TreeNode>();

    pQueue.Enqueue(p);
    qQueue.Enqueue(q);

    while (pQueue.Count > 0 || qQueue.Count > 0)
    {
        TreeNode pNode = pQueue.Dequeue();
        TreeNode qNode = qQueue.Dequeue();

        if (pNode == null && qNode == null)
        {
            continue;
        } 
        else if (pNode == null || qNode == null || pNode.val != qNode.val)
        {
            return false;
        }

        pQueue.Enqueue(pNode.left);
        pQueue.Enqueue(pNode.right);
        qQueue.Enqueue(qNode.left);
        qQueue.Enqueue(qNode.right);
    }
        
    return true;
}

使用迭代法也只对每个结点访问一次,时间复杂度为O(N),另外需要对应的辅助存储空间。在最优的情况下,空间复杂度为O(log(N)),最坏情况下为O(N)。

结束语

对于上述的示例有多种解法,如使用迭代法时可以只使用一个额外的辅助队列存放结点,但为了能让大家快速理解便未进行相应的优化。

今天的内容就到这里啦,我们下周再见👋~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值