已知二叉樹的中序加前序或后續可以還原出二叉樹(注:中序是必須知道的)

- 前序:a b c
- 中序:b a c
- 后續:b c a
1. 前序 + 中序
思路
對於例圖中,由前序可知,第一個元素即a是根節點,從對應的中序中找到a。從而進一步知道其左邊的b在左樹中,其右邊的c在右樹中,這樣結合前序遞歸可以還原出整個樹。
參考代碼
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: TreeNode* getTree(vector<int> &preorder, vector<int> &inorder, int prebeg, int preend, int inbeg, int inend) { if(prebeg < preend && inbeg < inend) { TreeNode *rev = new TreeNode(preorder[prebeg]); vector<int>::iterator mid = find(inorder.begin()+inbeg, inorder.begin()+inend, preorder[prebeg]); int span = mid - (inorder.begin() + inbeg); rev->left = getTree(preorder, inorder, prebeg+1, prebeg+1+span, inbeg, inbeg+span); rev->right = getTree(preorder, inorder, prebeg+1+span, preend, inbeg+span+1, inend); return rev; } return NULL; } TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) { return getTree(preorder, inorder, 0, preorder.size(), 0, inorder.size()); } };
2. 后序 + 中序
思路
對於例圖中,由后序可知,最后一個元素即a是根節點,從對應的中序中找到a。從而進一步知道其左邊的b在左樹中,其右邊的c在右樹中,這樣結合前序遞歸可以還原出整個樹。
參考代碼
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: TreeNode *getTree(vector<int> &inorder, vector<int> &postorder, int inbeg, int inend, int postbeg, int postend) { if (inbeg < inend && postbeg < postend) { TreeNode *rev =new TreeNode(postorder[postend-1]); vector<int>::iterator mid = find(inorder.begin()+inbeg, inorder.begin()+inend, postorder[postend-1]); int span = mid - (inorder.begin() + inbeg); rev->left = getTree(inorder, postorder, inbeg, inbeg+span, postbeg, postbeg+span); rev->right = getTree(inorder, postorder, inbeg+span+1, inend, postbeg+span, postend-1); return rev; } return NULL; } TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder) { return getTree(inorder, postorder, 0, inorder.size(), 0, postorder.size()); } };
3. 細節
利用vector引用的方式,可以避免每次復制導致空間利用過大,利用引用直接在原始空間內進行操作。
