【刷题】二叉树的相关练习

目录

[Leetcode]单值二叉树

 [Leetcode]相同的树

 [Leetcode]二叉树的前序遍历

 [Leetcode]另一棵树的子树

 [牛客]二叉树遍历


[Leetcode]单值二叉树

 思路:递归分治思想,根和自己的左右子树的值比较,相同则继续同样的操作,不同则直接返回false

 [Leetcode]相同的树

这道题思路上其实跟单值二叉树极为相似,也是采用分治思想,根和根比较,左子树跟左子树比较,右子树跟右子树比较,但这里不同的是需要讨论几种情况

 [Leetcode]二叉树的前序遍历

这道题关键的地方在于这里的返回值,它是需要返回一个数组的,这个数组当然需要malloc出来,而不是局部创建一个数组,当然这里还有一个问题就是,它的结点个数是未知的,所以malloc的大小也是无法确定的,所以就需要我们先写一个计算树的结点个数的函数

由于这里前序遍历需要保存每一次的值,所以我们再写一个函数用来存每一次递归得到的值 

 

按照思路我们整理出代码,提交发现没通过,什么原因呢,我们画一下递归展开图找一下问题,注意这里的问题很重要,很细节

我们通过画递归展开图发现了问题出在遍历右子树时,i的值不是我们想要的,这是为什么呢?

下面分析原因,i变成2的过程发生在遍历左子树时,遍历左子树时的i是一个局部变量,生命周期也只是局限在该递归函数中(所以这里其实是用了同一个字母i表示,实际并不是同一个i变化),所以,左子树遍历结束后,i的值又变成了1 。

所以这里的解决方式其实还是直接传地址

这样就通过了。 

 [Leetcode]另一棵树的子树

 这道题的思路其实跟相同树的思路很像,可以复用相同的树那道题的代码,这里唯一不一样的地方就是,让第一棵树的左右子树很第二棵树比较,只要有相等的就返回真

 [牛客]二叉树遍历

 这道题的意思通俗点就是给定一串字符串,这串字符串是一棵树前序遍历得到的,要求你根据这个字符串还原这棵树并将其通过中序遍历输出。

#include <stdio.h>
#include<stdlib.h>
struct TreeNode
{
    struct TreeNode* left;
    struct TreeNode* right;
    char val;
};

struct TreeNode* CreatTree(char*a,int* pi)
{
    if(a[*pi]=='#')
    {
        (*pi)++;
        return NULL;
    }
    struct TreeNode* root=(struct TreeNode*)malloc(sizeof(struct TreeNode));
    root->val=a[(*pi)++];
    root->left=CreatTree(a, pi);
    root->right=CreatTree(a, pi);
    return root;
}

void InOrder(struct TreeNode* root)
{
    if(root==NULL)
        return;
    InOrder(root->left);
    printf("%c ",root->val);
    InOrder(root->right);
}

int main() {
   char a[100];
   scanf("%s",a);
   int i=0;
   struct TreeNode* root= CreatTree(a,&i);
    InOrder(root);
    return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值