從前序與中序構造二叉樹
根據一棵樹的前序遍歷與中序遍歷構造二叉樹。
注意:
你可以假設樹中沒有重複的元素。
例如,給出
前序遍歷 preorder = [3,9,20,15,7]
中序遍歷 inorder = [9,3,15,20,7]
返回如下的二叉樹:
3
/
9 20
/
15 7
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
思路:前序遍歷構造順序:根左右
中序:左根右
找到左子節點和右子節點對應的下標
/**
* 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:
map<int,int>index;
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
int n=preorder.size();
//使用中序遍歷來構造雜湊表,方便尋找根節點的值
for(int i=0;i<n;i++)
{
index[inorder[i]]=i;
}
return myBuildTree(preorder,inorder,0,n-1,0,n-1);
}
TreeNode* myBuildTree(vector<int>& preorder,vector<int>& inorder,int preorder_left,int preorder_right,int inorder_left,int inorder_right)
{
if(preorder_left>preorder_right)
return nullptr;
//前序遍歷第一個節點就是根節點
int preorder_root=preorder_left;
//在中序遍歷中定位根節點
int inorder_root=index[preorder[preorder_root]];
//先把根節點建立出來
TreeNode *root=new TreeNode(preorder[preorder_root]);
//得到左子樹中的節點數目
int size_left=inorder_root-inorder_left;
//preorder_left+1 前序遍歷左節點元素位置左半部分,preorder_left+size_left右半部分//,inorder_left在中序遍歷元素的位置左邊界,inorder_root-1右邊界
root->left=myBuildTree(preorder,inorder,preorder_left+1,preorder_left+size_left,inorder_left,inorder_root-1);
root->right=myBuildTree(preorder,inorder,preorder_left+size_left+1,preorder_right,inorder_root+1,inorder_root);
return root;
}
};
相關文章
- LeetCode-105-從前序與中序遍歷序列構造二叉樹LeetCode二叉樹
- LeetCode 105. 從前序與中序遍歷序列構造二叉樹LeetCode二叉樹
- LeetCode 105. 從前序與中序遍歷序列構造二叉樹 | PytLeetCode二叉樹
- 從中序與後序遍歷序列構造二叉樹二叉樹
- LeetCode-106-從中序與後序遍歷序列構造二叉樹LeetCode二叉樹
- 【根據前序和中序遍歷構造二叉樹】棧+迭代 || 遞迴二叉樹遞迴
- 889. 根據前序和後序遍歷構造二叉樹二叉樹
- 二叉樹:構造二叉樹(通過前序和中序遍歷)、映象翻轉、層次遍歷二叉樹
- Leetcode 889. 根據前序和後序遍歷構造二叉樹LeetCode二叉樹
- 106. 從中序與後序遍歷序列構造二叉樹——Java實現二叉樹Java
- 二叉樹 ---- 前序 中序 後序 知二求一二叉樹
- 【資料結構與演算法】二叉樹的 Morris 遍歷(前序、中序、後序)資料結構演算法二叉樹
- 二叉樹的前序、中序、後序三種遍歷二叉樹
- 二叉樹的前序,中序,後序遍歷方法總結二叉樹
- 先序、中序、後序序列的二叉樹構造演算法二叉樹演算法
- 刷題系列 - 給出前序和後序遍歷佇列,構造對應二叉樹佇列二叉樹
- 144. 二叉樹的遍歷「前序、中序、後序」 Golang實現二叉樹Golang
- 二叉樹的前序、中序、後序的遞迴和迭代實現二叉樹遞迴
- 中序線索二叉樹的構造和遍歷二叉樹
- 388,先序遍歷構造二叉樹二叉樹
- 後序+中序(前序+中序)重構樹,嚴格O(N)演算法演算法
- 根據二叉樹的前序遍歷和中序遍歷輸出二叉樹;二叉樹
- 144.二叉樹的前序遍歷145.二叉樹的後序遍歷 94.二叉樹的中序遍歷二叉樹
- 【樹01】對二叉樹前序/中序/後序遍歷演算法的一些思考二叉樹演算法
- 二叉樹迭代器(中序遞迴、前序和後序遍歷)演算法二叉樹遞迴演算法
- 根據前序遍歷序列、中序遍歷序列,重建二叉樹二叉樹
- 【劍指offer】【4】根據前序和中序結果,重建二叉樹二叉樹
- 構造二叉樹二叉樹
- 刷題系列 - 中序和後序遍歷佇列,構造對應二叉樹;佇列二叉樹
- 刷題筆記:樹的前序、中序、後序遍歷筆記
- 【LeetCode-二叉樹】二叉樹前序遍歷LeetCode二叉樹
- [資料結構] 根據前中後序遍歷中的兩種構造二叉樹資料結構二叉樹
- L2_006樹的遍歷(後序+中序->前序/層序)
- 資料結構實驗之二叉樹八:(中序後序)求二叉樹的深度資料結構二叉樹
- 還原二叉樹(先序+中序-〉後序)二叉樹
- 劍指offer:輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。二叉樹
- 中序線索二叉樹的建立與遍歷二叉樹
- 144. 二叉樹的前序遍歷二叉樹