题目
从前序与中序遍历序列构造二叉树
根据一棵树的前序遍历与中序遍历构造二叉树。
注意:你可以假设树中没有重复的元素。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3
/ \
9 20
/
15 7
法一:递归
思路
根据前序遍历可以知道根节点,根据根节点可以在中序序列中得到左子树 和 右子树 的中序序列
我们可以得到如下信息:
- 先序序列------根节点的值
- 中序序列------根节点所在的下标
- 中序序列-----左子树的长度
- 中序序列-----右子树的长度
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <vector>
#include <map>
#include <list>
using namespace std;
struct TreeNode
{
int data;
TreeNode * left;
TreeNode * right;
TreeNode(int value)
{
data = value;
left = NULL;
right = NULL;
}
};
// 层序输出构建的二叉树
void PrintFromTopToBottom(TreeNode * root)
{
if(root == NULL)
{
return;
}
list<TreeNode *> l;
l.push_back(root);
while(!l.empty())