LeetCode100.相同的树(C语言)
给定两个二叉树,编写一个函数来检验它们是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
示例 1:
输入:
1 1
/ \ /
2 3 2 3
[1,2,3], [1,2,3]
输出: true
示例 2:
输入:
1 1
/
2 2
[1,2], [1,null,2]
输出: false
示例 3:
输入:
1 1
/ \ /
2 1 1 2
[1,2,1], [1,1,2]
输出: false
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/same-tree
思路:其实这题就是关于二叉树的遍历
方法一:递归实现(dfs)
先上代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
bool isSameTree(struct TreeNode* p, struct TreeNode* q){
if(p==NULL&&q==NULL)
return true;
if(p==NULL||q==NULL)
return false;
if(p->val==q->val)
{
return (isSameTree(p->left,q->left)&&isSameTree(p->right,q->right));
}
else
return false;
}
思路:如果p和q两者均不为null且p的值和q的值不相等,则递归判断p的左子树是否和q的左子树相等,p的右子树是否和q的右子树相等,只有两者都相等时,才返回true。
递归方法的代码比较简洁
方法二:非递归(队列实现,bfs)
上代码:
```c
bool isSameTree(struct TreeNode* p, struct TreeNode* q){
struct TreeNode* que[500];
int head=0,tail=0;
que[tail++]=p;
que[tail++]=q;
while(head<tail)
{
struct TreeNode*x=que[head++];
struct TreeNode*y=que[head++];
if(x==NULL&&y==NULL)
continue;
if(x==NULL||y==NULL||x->val!=y->val)
return false;
if(x->left!=NULL||y->left!=NULL)
{
que[tail++]=x->left;
que[tail++]=y->left;
}
if(x->right!=NULL||y->right!=NULL)
{
que[tail++]=x->right;
que[tail++]=y->right;
}
}
return true;
}
思路:用队列的话,对二叉树实现的就是从上至下的 逐层遍历
其中最主要的还是要理解其中的入队和出队的顺序等操作