实现二叉树重建:
输入一个字符串代表一个二叉树的先序遍历结果,其中#代表空结点,请建立这棵二叉树,并输出其中序遍历结果
解决: 实则是一个递归过程。每遇到一个新节点,就把它当做先序遍历的根节点进行构造,遇到#就为NULL,当一个结点的左右子树构造完成时,可以将该节点连接到上方结点,作为上一个结点的孩子结点。
具体解释详见专栏数据结构 5 数据结构—树&二叉树
代码如下:
#include <stdio.h>
typedef struct BTNode
{
char val;
struct BTNode* lchild;
struct BTNode* rchild;
}BTNode;
BTNode* CreatTree(char* str,int* i)//*i表示引用,影响下面i的内容
{
if(str[*i]=='#') //如果str[i]==‘#’ 为NULL
{
(*i)++;//注意不要忘记
return NULL;
}
else //字符str[i]不为#
{
BTNode* root=(BTNode*)malloc(sizeof(BTNode)); //申请结点
root->val=str[*i]; //当做根结点
(*i)++; //下一个
root->lchild=CreatTree(str,i); //先左子树
root->rchild=CreatTree(str,i);
return root;
}
}
void Inorder(BTNode* root) //先序左根右
{
if(root==NULL)
return;
Inorder(root->lchild);
printf("%c ",root->val);
Inorder(root->rchild);
}
int main()
{
char str[100];
scanf("%s",str);
int i=0;
Inorder(CreatTree(str,&i));
}
可以用一张图概括: