根据一棵树的前序遍历与中序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3 / \ 9 20 / \ 15 7
思路
从前序与中序遍历序列构造二叉树:
1、先取出前序的首个元素,在中序中找到位置,然后就可在中序中划分出左子树和右子树且知道左右子树的长度,
再根据左右子树的长度在前序中划分出左右子树。
2、对左子树的前序和中序执行1。
3、对右子树的前序和中序执行1。
4、连接节点和左右子树
5、返回节点
code
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
if(preorder.size()<1 || inorder.size()<1)
return NULL;
return buildTree(preorder,0,preorder.size()-1,inorder,0,inorder.size()-1);
}
TreeNode* buildTree(vector<int>& preorder, int pre_st, int pre_end, vector<int>& inorder, int in_st, int in_end) {
TreeNode *root = new TreeNode(preorder[pre_st]);
if(pre_st==pre_end)
return root;
int rootInorder = in_st;
while(inorder[rootInorder] !=root->val && rootInorder<=in_end)
rootInorder ++;
int left_len = rootInorder - in_st; //左子树的长度
int left_pre_end = pre_st+left_len; //左子树最后一个节点的位置
int right_len = pre_end - left_pre_end; //右子树的长度
if(left_len>0)
root->left = buildTree(preorder,pre_st+1,left_pre_end,inorder,in_st,in_end); //反正可以扫到,结尾是in_end不会增加程序时间
if(right_len>0)
root->right = buildTree(preorder,left_pre_end+1,pre_end,inorder,rootInorder+1,in_end);
return root;
}
};