您的位置:首页 > 其它

[LeetCode]105 根据先序遍历和中序遍历构建二叉树

2016-02-29 14:32 525 查看

Construct Binary Tree from Preorder and Inorder Traversal(根据先序遍历和中序遍历构建二叉树)

【难度:Medium】

Given preorder and inorder traversal of a tree, construct the binary tree.

Note:

You may assume that duplicates do not exist in the tree.

给定一棵二叉树的先序遍历和中序遍历结果,重构该二叉树。

假定二叉树中无重复值出现。

解题思路

根据题意,我们先来看一棵二叉树的先序遍历和中序遍历的结果:



先序遍历:1,2,4,6,7,5,3,8,9

中序遍历:6,4,7,2,5,1,8,3,9

与LeetCode 106题类似,

由先序遍历的定义,我们知道第一个值必定是二叉树的根节点root。由而中序遍历的定义,我们又可以发现根节点是左右子树的分界点。结合两者和在106题的基础上,对106的代码稍作修改,由先序遍历来确定每一个根节点,然后在中序遍历中找到该节点的下标i,那么[start, i-1]就是该i节点的左子树,[i+1, end]就是该i节点的右子树,直到叶子节点的出现。

c++代码如下:

/**
* 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.empty())
return NULL;
int root_index = 0;
return createBST(preorder,inorder,root_index,preorder.size()-1,root_index);
}
TreeNode* createBST(vector<int>& preorder, vector<int>& inorder, int start, int end, int& index) {
int v = preorder[index];
int i = start;
for (i; i <= end; i++)
if (v == inorder[i])
break;
TreeNode* root = new TreeNode(v);
if (i-1 >= start)
root->left = createBST(preorder,inorder,start,i-1,++index);
if (end >= i+1)
root->right = createBST(preorder,inorder,i+1,end,++index);
return root;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: