二叉树指针实现 根据中序和前序/后序得到一棵树
程序员文章站
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;
}
推荐阅读
-
PHP实现二叉树深度优先遍历(前序、中序、后序)和广度优先遍历(层次)实例详解
-
[PHP] 算法-根据前序和中序遍历结果重建二叉树的PHP实现
-
PHP实现二叉树深度优先遍历(前序、中序、后序)和广度优先遍历(层次)实例详解
-
[PHP] 算法-根据前序和中序遍历结果重建二叉树的PHP实现
-
二叉树指针实现 根据中序和前序/后序得到一棵树
-
二叉树前序、中序、后序遍历,递归和非递归实现
-
C++ | 二叉树前序、中序、后序遍历的递归和非递归实现 +层序遍历+深度优先遍历
-
根据中序遍历结果和前序(后序)遍历结果重构二叉树
-
根据前序遍历和中序遍历,后序遍历和中序遍历重构二叉树
-
如何根据二叉树前序和中序求后序