问题:
Given preorder and inorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
For example, given
preorder = [3,9,20,15,7] inorder = [9,3,15,20,7]
Return the following binary tree:
3 / \ 9 20 / \ 15 7
分析:
这道题要求根据前序和中序遍历画出这棵树。解题的关键点在于观察到前序遍历中的第一个肯定是根节点,中序遍历中在根节点左方的是左子树的节点,在根节点右方的是右子树的节点。根据这两个线索,就可以划分出左右两棵子树,然后再递归求解就可以了。详情看代码~~
/**
* 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) {
TreeNode* res;
if( preorder.size() == 0 ){//树是空的
return NULL;
}
res = new TreeNode(preorder[0]);
if( preorder.size() == 1 ){//只剩下一个节点
return res;
}
int index;
for( int i = 0 ; i < inorder.size() ; i++ ){
if( inorder[i] == preorder[0] ){//找到根节点在中序排序的位置
index = i;
break;
}
}
vector<int> preLeft;
vector<int> preRight;
vector<int> inLeft;
vector<int> inRight;
for( int i = 0 ; i < index ; i++ ){//以找到的下标为界,构建出两个子树的前序和中序遍历
inLeft.push_back( inorder[i] );
preLeft.push_back( preorder[i+1] );
}
for( int i = index + 1 ; i < inorder.size() ; i++ ){
inRight.push_back(inorder[i]);
preRight.push_back( preorder[i] );
}
res->left = buildTree( preLeft , inLeft );//递归求解
res->right = buildTree( preRight , inRight );
return res;
}
};