二叉树前序:遍历顺序为,根节点、左子树、右子树;中序:遍历顺序为,左子树、根节点、右子树;后序:遍历顺序为,左子树、右子树、根节点
可以发现,二叉树前序中的第一个节点为树的根节点root,然后找出root在中序里面的位置,就可以把前序和中序分别划分为左、右子树两个部分,然后递归调用即可。
举个例子,前序 5 3 2 4 8 6 10 中序 2 3 4 5 6 8 10
首先,5肯定是二叉树的根节点,然后5在中序里面的位置是3号(从0开始),此位置前面的是左子树中的节点,右面的是右子树的节点,即5 || 3 2 4 || 8 2 6 , 2 3 4 || 5 || 6 8 10,对红色的左子树序列、蓝色的右子树序列继续上述过程,直至结束。
//二叉树 前序和中序得到后序
#include <iostream>
using namespace std;
typedef struct node
{
char key;
struct node *left;
struct node *right;
}treeNode;
char pre_order[100];
char mid_order[100];
treeNode* construct_post_order(int pre_l, int pre_r, int mid_l, int mid_r)
{
if (pre_r - pre_l < 0)
{
return NULL;
}
treeNode *root;
root = new treeNode;
root->key = pre_order[pre_l];
if (pre_r == pre_l)
{
root->left = NULL;
root->right = NULL;
return root;
}
int index;
for (index = mid_l; index <= mid_r; index++)
{
if (mid_order[index] == pre_order[pre_l])
break;
}
root->left = construct_post_order(pre_l+1, pre_l+(index-mid_l), mid_l, index-1);
root->right = construct_post_order(pre_l+(index-mid_l)+1, pre_r, index+1, mid_r);
return root;
}
void post_Order(treeNode *root)
{
if(root != NULL)
{
post_Order(root->left);
post_Order(root->right);
cout<<(root->key);
}
}
int main()
{
int n;
cout<<"输入序列的长度\n";
cin>>n;
cout<<"输入二叉树前序\n";
for (int i = 0; i < n; i++)
cin>>pre_order[i];
cout<<"输入二叉树中序\n";
for (int i = 0; i < n; i++)
cin>>mid_order[i];
treeNode *root = construct_post_order(0, n-1, 0, n-1);
cout<<"二叉树的后序为\n";
post_Order(root);
printf("\n");
return 0;
}