您的位置:首页 > 其它

【LeetCode】Construct Binary Tree from Preorder and Inorder Traversal

2014-05-21 01:49 393 查看
题目描述:

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

Note:

You may assume that duplicates do not exist in the tree.
注意树中不存在相同的元素,这意味着我们可以通过val值来分辨不同的元素。
正序遍历顺序为从根->左孩子->右孩子,中序遍历为左孩子->根->右孩子,可以看出preorder[0]即为根,从inorder中以根为分界点划分为左子树和右子树,元素数目分别为L和R,则从preorder[1]开始L个元素即为左子树的正序遍历,preorder[1]为左子树的根;preorder[L+1]开始为右子树的正序遍历,preorder[L+1]为右子树的根。

由此可以归结为递归问题。收敛条件即L和R小于1。

代码如下:

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;
TreeNode *root = new TreeNode(preorder[0]);
treeNode(preorder, inorder, root, 0, 0, inorder.size() - 1);
return root;
}
void treeNode(vector<int> &preorder, vector<int> &inorder, TreeNode *root, int rodex, int left, int right)
{
int curr(0);
for (int i = left; i < inorder.size();i++)
if (inorder[i] == root->val)
{
curr = i;
break;
}
int llen = curr - left + 1;
int rlen = right - curr + 1;
if (llen > 1)
{
root->left = new TreeNode(preorder[rodex + 1]);
treeNode(preorder, inorder, root->left, rodex + 1, left, curr - 1);
}
if (rlen > 1)
{
root->right = new TreeNode(preorder[rodex + llen]);
treeNode(preorder, inorder, root->right, rodex + llen, curr + 1, right);
}
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐