1:相同的树
相关链接. - 力扣(LeetCode)
解题思路:已给出两棵树的根节点,可以利用递归每次判断两棵树的根节点是否相同,
-
- 如果两棵树都为空(即两个指针
p
和q
都为NULL
),那么它们被认为是相同的,函数返回true
。 - 如果一棵树为空而另一棵不为空(即
p
和q
中只有一个为NULL
),那么它们被认为是不同的,函数返回false
。
- 如果两棵树都为空(即两个指针
-
节点值比较:
- 如果两棵树都不为空,首先比较当前节点的值(
p->val
和q->val
)。如果这两个值不相等,那么两棵树是不同的,函数返回false
。
- 如果两棵树都不为空,首先比较当前节点的值(
-
递归处理子树:
- 如果当前节点的值相等,那么继续递归地检查两棵树的左子树和右子树是否相同。
- 使用
isSameTree(p->left, q->left)
来判断左子树是否相同。 - 使用
isSameTree(p->right, q->right)
来判断右子树是否相同。 - 使用逻辑与操作符
&&
来确保两棵子树都相同。
-
返回值:
- 如果以上所有条件都满足(即两棵树都为空、或者它们的节点值相等并且它们的子树也相同),那么函数返回
true
,表示两棵树是相同的。
- 如果以上所有条件都满足(即两棵树都为空、或者它们的节点值相等并且它们的子树也相同),那么函数返回
代码展示
bool isSameTree(struct TreeNode* p, struct TreeNode* q) {
if(p==NULL&&q==NULL)
return true;
if(q==NULL||p==NULL)
return false;
if(p->val!=q->val)
return false;
return isSameTree(p->left,q->left)
&&isSameTree(p->right,q->right);
}
2:另一棵树的子树
相关链接. - 力扣(LeetCode)
解题思路:在求两个树是否为相同树的基础上进行改造
- 基本情况处理:
- 如果
root
为空,而我们要找的子树的根subRoot
不为空,那么显然root
不可能包含subRoot
作为子树,直接返回false
。
- 如果
- 检查是否相同:
- 如果
root
和subRoot
的根节点值相等,那么调用isSameTree
函数来检查root
和subRoot
是否完全相同。如果它们完全相同,那么subRoot
就是root
的一个子树(实际上是root
本身),返回true
。
- 如果
- 递归搜索左右子树:
- 如果
root
和subRoot
的根节点值不相等,或者它们虽然根节点值相等但不是完全相同的树,那么我们就需要继续在root
的左子树和右子树中搜索subRoot
是否作为子树存在。 - 通过递归调用
isSubtree(root->left, subRoot)
来检查左子树是否包含subRoot
。 - 如果左子树不包含
subRoot
,则递归调用isSubtree(root->right, subRoot)
来检查右子树是否包含subRoot
。 - 如果左右子树中任意一个返回
true
,则表示root
包含subRoot
作为子树,函数返回true
。
- 如果
- 返回值:
- 如果以上所有情况都不满足,那么
root
不包含subRoot
作为子树,函数返回false
。
- 如果以上所有情况都不满足,那么
代码展示
bool isSameTree(struct TreeNode* p, struct TreeNode* q) {
if(p==NULL&&q==NULL)
return true;
if(q==NULL||p==NULL)
return false;
if(p->val!=q->val)
return false;
return isSameTree(p->left,q->left)
&&isSameTree(p->right,q->right);
}
bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){
if(root==NULL)
return false;
if(root->val==subRoot->val&&isSameTree(root,subRoot))
return true;
return isSubtree(root->left,subRoot)||isSubtree(root->right,subRoot);
}
3:二叉树遍历
相关链接二叉树遍历_牛客题霸_牛客网
代码展示
#include <stdio.h>
#include<stdlib.h>
typedef struct BTNode{
struct BTNode* left;
struct BTNode* right;
char c;
}BTNode;
BTNode* bianli(char* c,int* pi)
{
if(c[(*pi)]=='#')
{
(*pi)++;
return NULL;
}
BTNode* root=(BTNode*)malloc(sizeof(BTNode));
root->c=c[(*pi)++];
root->left=bianli(c,pi);
root->right=bianli(c,pi);
return root;
}
void Mid(BTNode* root)
{
if(root==NULL)
return ;
Mid(root->left);
printf("%c ", root->c);
Mid(root->right);
}
int main()
{
char a[100];
scanf("%s",a);
int i=0;
BTNode* root=bianli(a,&i);
Mid(root);
return 0;
}