实现二叉树重建

79 阅读1分钟

实现二叉树重建:

输入一个字符串代表一个二叉树的先序遍历结果,其中#代表空结点,请建立这棵二叉树,并输出其中序遍历结果

解决: 实则是一个递归过程。每遇到一个新节点,就把它当做先序遍历的根节点进行构造,遇到#就为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));
}


可以用一张图概括:

图片.png