回顾一下二叉树的三种遍历
先序: 根->左->右
中序:左->根->右
后序:左->右->根
只要我们知道中序和先序或着后序 那么我们就可以根据已知的两种遍历序列
求出剩下的另一种遍历序列
例:已知该二叉树的先序遍历序列为:A-B-D-E-G-C-F,中序遍历序列为:D-B-G-E-A-C-F。求该二叉树后序遍历序列
第一步:找根 先序遍历先遍历根结点 那么它的序列第一个肯定是根节点也就是上面的A
第二步:找根结点的左右子数 中序遍历先左后根后右 在中序序列中找到根结点的位置那么它的左边就是它的左子树序列 右边就是它的右子数序列
即上面的 D-B-G-E 和 C-F
第三步:拆分转化为子问题 去掉A结点 将树分为两个二叉树 B-D-E-G 和C-F
然后按照第一步分别找两颗树的根 B C 然后根据第二部找根的左右子数
B(左边D 右边 G-E) C (左边NULL 右边 F) 一次类推 直到还原出二叉树的模型
最后我们就可以根据后续遍历规则得出该二叉树的后续遍历序列为:D-G-E-B-F-C-A。
struct Node
{
char data;
Node *left;
Node *right;
};
Node *getBinaryTree(char *preOrder, char *inOrder, int len)
{
if (preOrder == NULL || *preOrder == '\0' || len <= 0)
return NULL;
Node *root = new Node;
root->data = *preOrder; // 前序遍历的第一个节点就是根节点
// 找到根节点在中序遍历中的位置,其值也代表了左子树的节点数目
int pos = 0;
while (1)
{
if (*(inOrder + pos) == root->data)
{
break;
}
pos++;
}
// 递归找到左子树和右子树
if (0 == pos)
{
root->left = NULL;
}
else
{
root->left = getBinaryTree(preOrder + 1, inOrder, pos);
}
if (0 == len - pos - 1)
{
root->right = NULL;
}
else
{
root->right = getBinaryTree(preOrder + pos + 1, inOrder + pos + 1, len - pos - 1);
}
return root;
}
void postOrder(Node *root)
{
if (root == NULL)
return;
postOrder(root->left);
postOrder(root->right);
cout << root->data;
}