您的位置:首页 > 其它

Construct Binary Tree from Preorder and Inorder Traversal LeetCode 105

2015-05-27 10:22 218 查看
题目描述:

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

Note:

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

Hide Tags Tree Array Depth-first Search

分析:

已知二叉树的先序序列和中序序列构造二叉树,该二叉树必然是唯一的。先序序列的首元素必然是二叉树的根,然后该元素将中序序列中的元素分为两个子序列,左边的序列由左子树构成,右边的序列由右子树构成,于是可以递归的处理左序列和有序列,分别产生左子树和右子树。

以下是C++实现代码,实现中要注意参数传递采用引用传递的方式,这样可以避免拷贝数组,降低内存消耗,否则会发生内存超限的错误。

/**//////////////////56ms/////*/
/**
* 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:
void buildHelp(TreeNode* &r,vector<int>& pre,vector<int>& in,int preLef,int preRig,int inLef,int inRig) //根据先序和中序子序列构造节点
{
if(inLef > inRig) //表示空二叉树
r = NULL;
else
{
r = new TreeNode(pre[preLef]); //利用先序序列的首元素生成根节点
int mid = inLef;
while(in[mid] != pre[preLef]) //在中序序列中找到根节点对应的元素,将中序序列分割为左右两个中序子序列
mid++;
buildHelp(r->left,pre,in,preLef+1,preLef+mid-inLef,inLef,mid-1); //利用左子序列的先序和中序构造左子树
buildHelp(r->right,pre,in,preLef+1+mid-inLef,preRig,mid+1,inRig); //利用右子序列的先序和中序构造右子树
}
}

TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
int n = preorder.size();
if(n == 0)
return NULL;

TreeNode *r;
buildHelp(r,preorder,inorder,0,n-1,0,n-1); //调用辅助函数,构造二叉树
return r;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐