二叉树相关Oj题

1:相同的树

  相关链接. - 力扣(LeetCode)

  解题思路:已给出两棵树的根节点,可以利用递归每次判断两棵树的根节点是否相同,

    • 如果两棵树都为空(即两个指针pq都为NULL),那么它们被认为是相同的,函数返回true
    • 如果一棵树为空而另一棵不为空(即pq中只有一个为NULL),那么它们被认为是不同的,函数返回false
  1. 节点值比较

    • 如果两棵树都不为空,首先比较当前节点的值(p->val 和 q->val)。如果这两个值不相等,那么两棵树是不同的,函数返回false
  2. 递归处理子树

    • 如果当前节点的值相等,那么继续递归地检查两棵树的左子树和右子树是否相同。
    • 使用isSameTree(p->left, q->left)来判断左子树是否相同。
    • 使用isSameTree(p->right, q->right)来判断右子树是否相同。
    • 使用逻辑与操作符&&来确保两棵子树都相同。
  3. 返回值

    • 如果以上所有条件都满足(即两棵树都为空、或者它们的节点值相等并且它们的子树也相同),那么函数返回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)

解题思路:在求两个树是否为相同树的基础上进行改造

  1. 基本情况处理
    • 如果 root 为空,而我们要找的子树的根 subRoot 不为空,那么显然 root 不可能包含 subRoot 作为子树,直接返回 false
  2. 检查是否相同
    • 如果 root 和 subRoot 的根节点值相等,那么调用 isSameTree 函数来检查 root 和 subRoot 是否完全相同。如果它们完全相同,那么 subRoot 就是 root 的一个子树(实际上是 root 本身),返回 true
  3. 递归搜索左右子树
    • 如果 root 和 subRoot 的根节点值不相等,或者它们虽然根节点值相等但不是完全相同的树,那么我们就需要继续在 root 的左子树和右子树中搜索 subRoot 是否作为子树存在。
    • 通过递归调用 isSubtree(root->left, subRoot) 来检查左子树是否包含 subRoot
    • 如果左子树不包含 subRoot,则递归调用 isSubtree(root->right, subRoot) 来检查右子树是否包含 subRoot
    • 如果左右子树中任意一个返回 true,则表示 root 包含 subRoot 作为子树,函数返回 true
  4. 返回值
    • 如果以上所有情况都不满足,那么 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;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值