Given preorder and inorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
Subscribe to see which companies asked this question
分析:
先序遍历的第一个肯定是根root。中序遍历root左边必为root左子树的中序遍历,右边必为右子树的中序遍历。先序遍历的必定是遍历左子树,然后遍历右子树,左子树node的个数必与中序遍历root左边相同,设为n个,则先序遍历的前1~n个必为左子树的先序遍历,后边必为右子树的先序遍历。所以这是一个递归解法。
这题中我在指针的处理上遇到很多问题,看样子还是要好好看看书。
解法:
/**
* 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 {
TreeNode* build(int* preorder,int* inorder,int len)
{
if(len==0) return NULL;
TreeNode* root=new TreeNode(*preorder);
int left_int=0;
for(;left_int<len;++left_int)
{
if(*(inorder+left_int)==root->val)
break;
}
root->left=build((preorder+1),(inorder),left_int);
root->right=build((preorder+left_int+1),(inorder+left_int+1),len-left_int-1);
return root;
}
public:
TreeNode* buildTree(vector<int> preorder, vector<int> inorder) {
int len=preorder.size();
if(len==0) return NULL;
TreeNode* root=build(&(preorder[0]),&(inorder[0]),len);
return root;
}
};