代码改变世界

二叉树判断是否相等

2019-07-01 16:17  heixialee  阅读(1660)  评论(0编辑  收藏  举报

1、题目
Given two binary trees, write a function to check if they are equal or not.

Two binary trees are considered equal if they are structurally identical and the nodes have the same value.

2、分析
判断两棵树是否相同,最直接的方法是用递归,假设两棵树的根节点分别是p、q,则它们相同的前提是p和q的值相同,并且它们的左右子树也分别相同,显然对左右子树可以递归地调用原函数。

运用迭代法的话,只需要维护一个栈,如果p、q的值相同,则依次将p->left,q->left ,p->right,q->right入栈,然后下一次循环开始时,就判断栈顶的p->right和q->right的值是否相同,相同的话,再把它们的左右孩子依次入栈,循环以上过程,直到碰到值不相等或者栈为空。【迭代法的算法流程可参考下面图解】
(本题注意:两个空树是相等的)
3、代码
#递归版
<span style="font-size:18px;">/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool isSameTree(TreeNode *p, TreeNode *q) {
if (!p && !q) return true;

return (p && q && (p->val==q->val) &&isSameTree(p->left,q->left) && isSameTree(p->right,q->right));
}
};</span>


#迭代版
class Solution {
public:
bool isSameTree(TreeNode *p, TreeNode *q) {
stack<TreeNode *> s;
s.push(p);
s.push(q); //即使是空节点,也是可以push到栈里的,栈并不为空。
while(!s.empty())
{
p=s.top();s.pop();
q=s.top();s.pop();

if(!p && !q) continue; //p、q都是空节点
if(!p || !q) return false; //有一个为空,不相等
if(p->val!=q->val) return false; //值不相等

s.push(p->left);s.push(q->left);
s.push(p->right);s.push(q->right);
}
return true;
}
};

---------------------
作者:wepon_
来源:CSDN
原文:https://blog.csdn.net/u012162613/article/details/41212315
版权声明:本文为博主原创文章,转载请附上博文链接!