题目:已知某一个二叉树的前序遍历和中序遍历,求该二叉树的后续遍历。
解答:
前序遍历第一个节点就是根节点,可以根据这个根节点和中序遍历的定义(先遍历左子树,再遍历根节点,最后遍历右子数)将中序遍历分成左子树的中序遍历和右子树的中序遍历,递归构造二叉树。
注意:
解答:
前序遍历第一个节点就是根节点,可以根据这个根节点和中序遍历的定义(先遍历左子树,再遍历根节点,最后遍历右子数)将中序遍历分成左子树的中序遍历和右子树的中序遍历,递归构造二叉树。
注意:
- 二叉树的三种遍历中:前序遍历、中序遍历、后序遍历并不能都可以已知两种遍历求第三种遍历,必须已知中序遍历,即前序遍历和后序遍历不能得到中序遍历。
- 此题若是根据后序遍历和中序遍历求前序遍历,代码基本类似,只是后续遍历的结果需要从最后开始找根节点。
代码:
#include <iostream>
using namespace std;
struct Node
{
Node *left;
Node *right;
char value;
};
void buildTree(char *pPreOrder, char *pInOrder, int len, Node **pRoot)
{
if(pPreOrder == 0 || pInOrder == 0)
return;
Node *ptemp = new Node;
ptemp->left = 0;
ptemp->right = 0;
ptemp->value = pPreOrder[0];
if(*pRoot == 0)
*pRoot = ptemp;
if(len == 1)
return;
char *pLeftEnd = pInOrder;
int templen = 0;
while(*pLeftEnd != *pPreOrder)
{
if(pLeftEnd == 0 || pPreOrder == 0)
break;
if(templen++ > len)
break;
pLeftEnd++;
}
int nleftlen = (int)(pLeftEnd - pInOrder);
int nrightlen = (int)(len - nleftlen - 1);
if(nleftlen > 0)
buildTree(pPreOrder + 1, pInOrder, nleftlen, &((*pRoot)->left));
if(nrightlen > 0)
buildTree(pPreOrder + nleftlen + 1, pInOrder + nleftlen + 1,
nrightlen, &((*pRoot)->right));
}
void postOrderOutput(Node *proot)
{
if(proot == 0) return;
postOrderOutput(proot->left);
postOrderOutput(proot->right);
cout << " " << proot->value;
}
int main()
{
char szPreOrder[6] = {'a', 'b', 'd', 'c', 'e', 'f'};
char szInOrder[6] = {'d', 'b', 'a', 'e', 'c', 'f'};
Node *proot = 0;
buildTree(szPreOrder, szInOrder, 6, &proot);
postOrderOutput(proot);
cout << endl;
return 0;
}