目录
[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;
}