Given inorder and postorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
分析:
首先要弄清楚什麼是後序遍歷和中序遍歷?
前序遍歷,先遍歷當前的節點,然後遍歷該節點的左分支(即遍歷左分支的所有節點),最後再遍歷該節點的右分支。
中序遍歷,先遍歷當前節點的左分支,再遍歷當前節點,最後遍歷當前節點的右分支。
後序遍歷,就是先左分支,再右分支,最後當前節點。
以下面的二叉樹爲例。
4
/ \
2 7
/ \ / \
1 3 6 9
其後序遍歷結果:【1 3 2 6 9 7 4】
中序遍歷結果是:【1 2 3 4 6 7 9】
對後序遍歷來說:
後序遍歷的末尾結點都是前面的若干個結點(根據中序遍歷即可確定)的父結點。
比如【4】是這個二叉樹的根結點,【2】是【1 3】的父結點,【7】是【4 6】的父結點,
對中序遍歷來說:
根結點(根據後序遍歷即可得)一定在中間位置,該位置左邊是其左子樹,右邊是其右子樹。
比如【4】左邊【1 2 3】全是根結點的左子樹,右邊是【6 7 9】是根結點的右子樹。
對於【2】來說,【1】是其左子樹,【3】是其右子樹。
……
依次類推。
很明顯,這是一個遞歸過程。
/**
* 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>& inorder, vector<int>& postorder) {
if(postorder.size()==0 || postorder.size()!=inorder.size())
return NULL;
return helpBuild(postorder, 0, postorder.size()-1, inorder, 0, inorder.size()-1);
}
TreeNode* helpBuild(
vector<int> &postorder, int beginp, int endp,
vector<int> &inorder, int beginord, int endord)
{
if(beginp > endp)
return NULL;
else if(beginp == endp)
return new TreeNode(postorder[endp]);
TreeNode* root = new TreeNode(postorder[endp]);
int i = beginord;
for(; i <= endord; i ++)
{
if(inorder[i] == postorder[endp])
break;
}
int leftlen = i-beginord;
root->left = helpBuild(postorder, beginp, beginp+leftlen-1, inorder, beginord, beginord+leftlen-1);
root->right = helpBuild(postorder, beginp+leftlen, endp-1, inorder, beginord+leftlen+1, endord);
return root;
}
};
注:本博文爲EbowTang原創,後續可能繼續更新本文。如果轉載,請務必複製本條信息!
原文地址:http://blog.csdn.net/ebowtang/article/details/51582189
原作者博客:http://blog.csdn.net/ebowtang
本博客LeetCode題解索引:http://blog.csdn.net/ebowtang/article/details/50668895