【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)。
结束语
对于上述的示例有多种解法,如使用迭代法时可以只使用一个额外的辅助队列存放结点,但为了能让大家快速理解便未进行相应的优化。
今天的内容就到这里啦,我们下周再见👋~