- 題目:根據中序和後序遍歷構建二叉樹
- 思路:利用遞迴加上分治的思想。先找到根節點的值,然後在根據中序遍歷找到根節點的左右兩邊的值,然後在遞迴的處理左右兩邊的左右子樹。這裡的關鍵在於怎麼處理遞迴的左右子樹的範圍,程式碼裡面詳細解釋
- 程式碼:
class Solution { public: TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder) { vector<int>::size_type lenIn = inorder.size(); vector<int>::size_type lenPost = postorder.size(); return buildTree_Aux(inorder,0,lenIn-1,postorder,0,lenPost-1); } TreeNode *buildTree_Aux(vector<int> &inorder,int inB,int inE, vector<int> &postorder,int poB,int poE) { if(inB > inE || poB > poE) return NULL; //在後序遍歷中確定根節點 TreeNode* root = new TreeNode(postorder[poE]); //在中序遍歷中確定左右子樹 vector<int>::iterator iter = find(inorder.begin()+inB,inorder.begin()+inE,postorder[poE]); int index = iter - inorder.begin();//根節點的位置
root->left = buildTree_Aux(inorder,inB,index-1,postorder,poB,poB+index-1-inB);
//這裡postorder,poB,poB+index-1-inB這部分表示後序的左子樹。pob是開始位置,index-1-inB是後序左子樹的節點數的個數。poB+index-1-inB是後序的左子樹的尾部 root->right = buildTree_Aux(inorder,index+1,inE,postorder,poB+index-inB,poE-1);
//這裡postorder,poB+index-inB,poE-1這部分表示後序的右子樹。poB+index-inB右子樹開始位置,poE-1右子樹結束位置,去掉了根節點的值(最尾部) return root; } }; - 題目:根據前序和中序遍歷構建二叉樹
- 思路:類似
- 程式碼:
/** * 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 *buildTree(vector<int> &preorder, vector<int> &inorder) { vector<int>::size_type lenIn = inorder.size(); vector<int>::size_type lenPre = preorder.size(); return buildTree_Aux(preorder, 0, lenPre-1, inorder, 0, lenIn-1); } TreeNode *buildTree_Aux(vector<int> &preorder,int prb,int pre, vector<int> &inorder,int inb,int ine) { if (prb > pre || inb > ine) return NULL; TreeNode *root = new TreeNode(preorder[prb]); vector<int>::iterator iter = find(inorder.begin()+inb,inorder.begin()+ine,preorder[pre]); int mid = iter - inorder.begin(); root->left = buildTree_Aux(preorder, prb+1, prb+mid-inb, inorder, inb, mid-1); root->right = buildTree_Aux(preorder, prb+1+mid-inb, pre, inorder, mid+1, ine); return root; } };
(樹)根據中序後序構建二叉樹
相關文章
- 889. 根據前序和後序遍歷構造二叉樹二叉樹
- Leetcode 889. 根據前序和後序遍歷構造二叉樹LeetCode二叉樹
- 還原二叉樹(先序+中序-〉後序)二叉樹
- [資料結構] 根據前中後序遍歷中的兩種構造二叉樹資料結構二叉樹
- 根據二叉樹的前序遍歷和中序遍歷輸出二叉樹;二叉樹
- 先序、中序、後序序列的二叉樹構造演算法二叉樹演算法
- 【根據前序和中序遍歷構造二叉樹】棧+迭代 || 遞迴二叉樹遞迴
- 從中序與後序遍歷序列構造二叉樹二叉樹
- 根據前序遍歷序列、中序遍歷序列,重建二叉樹二叉樹
- 資料結構實驗之二叉樹八:(中序後序)求二叉樹的深度資料結構二叉樹
- 二叉樹中序和後序遍歷表示式二叉樹
- 二叉樹 ---- 前序 中序 後序 知二求一二叉樹
- 【劍指offer】【4】根據前序和中序結果,重建二叉樹二叉樹
- 二叉樹的四種遍歷方法:先序,中序,後序,層序二叉樹
- 二叉樹的前序、中序、後序三種遍歷二叉樹
- 二叉樹--後序遍歷二叉樹
- 已知二叉樹的先序和後序求任意一中序二叉樹
- LeetCode-106-從中序與後序遍歷序列構造二叉樹LeetCode二叉樹
- 二叉樹的前序,中序,後序遍歷方法總結二叉樹
- 二叉樹的先中後序遍歷二叉樹
- 二叉樹的先,中,後序遍歷二叉樹
- 二叉樹的前中後序遍歷二叉樹
- 演算法 -- 實現二叉樹先序,中序和後序遍歷演算法二叉樹
- 從前序與中序構造二叉樹二叉樹
- 遞迴和迭代實現二叉樹先序、中序、後序和層序遍歷遞迴二叉樹
- 後序+中序(前序+中序)重構樹,嚴格O(N)演算法演算法
- 刷題系列 - 中序和後序遍歷佇列,構造對應二叉樹;佇列二叉樹
- 106. 從中序與後序遍歷序列構造二叉樹——Java實現二叉樹Java
- 144.二叉樹的前序遍歷145.二叉樹的後序遍歷 94.二叉樹的中序遍歷二叉樹
- 二叉樹的前序、中序、後序的遞迴和迭代實現二叉樹遞迴
- 144. 二叉樹的遍歷「前序、中序、後序」 Golang實現二叉樹Golang
- 【樹01】對二叉樹前序/中序/後序遍歷演算法的一些思考二叉樹演算法
- 【資料結構與演算法】二叉樹的 Morris 遍歷(前序、中序、後序)資料結構演算法二叉樹
- python-二叉樹:前、中、後、層序遍歷Python二叉樹
- 388,先序遍歷構造二叉樹二叉樹
- LeetCode 285 & 510. 二叉樹中序後繼 I & IILeetCode二叉樹
- 二叉樹:前中後序迭代方式統一寫法二叉樹
- 二叉樹迭代器(中序遞迴、前序和後序遍歷)演算法二叉樹遞迴演算法
- 中序線索二叉樹的構造和遍歷二叉樹