4 重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
运用栈实现
# python 解法
class Solution:
def buildTree(self, preorder, inorder):
if not preorder:
return None
root = TreeNode(preorder[0])
stack = [root]
inorderIndex = 0
for i in range(1, len(preorder)):
addnode = TreeNode(preorder[i])
head = stack[-1]
if stack[-1].val != inorder[inorderIndex]:
head.left = addnode
stack.append(addnode)
else:
while stack and stack[-1].val == inorder[inorderIndex]:
rootnode = stack.pop()
inorderIndex += 1
rootnode.right = addnode
stack.append(addnode)
return root
/**
* 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.size() == 0 or inorder.size() == 0 or preorder.size() != inorder.size()){
return 0;
}
stack<TreeNode*> st;
TreeNode* root = new TreeNode(preorder[0]);
st.push(root);
int j = 0;
for(int i=1;i<preorder.size();i++){
TreeNode* now = new TreeNode(preorder[i]);
TreeNode* head = st.top();
if(head->val == inorder[j]){
while (not st.empty() && j<preorder.size() && st.top()->val == inorder[j]){
head = st.top();
st.pop();
j = j+1;
}
head->right = now;
}
else{
head->left = now;
}
st.push(now);
}
return root;
}
};