欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

二叉树指针实现 根据中序和前序/后序得到一棵树

程序员文章站 2022-05-20 21:35:52
...
#include<bits/stdc++.h>
using namespace std;
const int maxn = 100+5;

struct BinaryTreeNode{
    int T_Value;
    BinaryTreeNode* T_Left;
    BinaryTreeNode* T_Right;
};

BinaryTreeNode* ConstructCore(int* startPre,int* endPre,int* startIn,int* endIn)
{
    int rootValue = startPre[0];
    BinaryTreeNode* root  = new BinaryTreeNode();
    root->T_Left=root->T_Right = nullptr;
    root->T_Value=rootValue;
    //如果只有一个节点
    if(startPre==endPre&&startIn==endIn&&*startPre==*endPre&&*startIn==*endIn&&*startPre==*endIn)
    {
        return root;
    }
    //反之寻找中序遍历中的根节点
    int* rootInorder = startIn;
    while(rootInorder<endIn&&*rootInorder!=rootValue)
    {
        ++rootInorder;
    }
    //如果在中序序列中无法找到根节点
    if(rootInorder==endIn&&*rootInorder!=rootValue)
    {
        printf("The Input Is Wrong!!!\n");
        return root;
    }
    //否则,找到根节点,就进行递归建树
    int LeftLength = rootInorder-startIn;
    int RightLength = endIn - rootInorder;
    int* LeftPrestart = startPre + LeftLength;
    if(LeftLength>0)
    {
        ConstructCore(startPre+1,startPre+LeftLength-1,startIn,rootInorder-1);
    }
    //构建右子树
    if(RightLength>0)
    {
        ConstructCore(LeftPrestart+1,endPre,rootInorder+1,endIn);
    }
    return root;
}

BinaryTreeNode* Construct(int* PreOrder,int* InOrder,int length)
{
    if(PreOrder==nullptr||InOrder==nullptr||length<=0) return nullptr;
    return ConstructCore(PreOrder,PreOrder+length-1,InOrder,InOrder+length-1);
}

int main()
{
    int n;
    scanf("%d",&n);
    int pre[maxn],inorder[maxn];
    for(int i = 0;i<n;i++)
    {
        scanf("%d",&pre[i]);
    }
    for(int i=0;i<n;i++)
    {
        scanf("%d",&inorder[i]);
    }
    BinaryTreeNode* root = Construct(pre,inorder,n);
    return 0;
}