文章目錄
題目描述
代碼 & 思路
- 前序:根 - 左 - 右; 中序:左 - 根 - 右,那么用前序數組的首位(即根)的值到中序數組查找對應位置,就可以由此得到左右子樹的結點數。
- 遞歸進行,每次構造當前根結點,然后開啟左、右子樹的遞歸函數即可。
- 用一次循環來構建<根結點val,中序index>的哈希表,就不用每次都循環查找一次根節點index。
class Solution {public TreeNode buildTree(int[] preorder
, int[] inorder
) {Map<Integer,Integer> map
= new HashMap();for(int i
=0;i
< inorder
.length
;i
++){map
.put(inorder
[i
],i
);}return toBuildTree(new TreeNode(),preorder
,0,preorder
.length
-1,inorder
,0,inorder
.length
-1,map
);}TreeNode toBuildTree(TreeNode root
, int[] preorder
, int pL
, int pR
, int[] inorder
, int iL
, int iR
, Map<Integer,Integer> map
){int rootIndex
= map
.get(preorder
[pL
]);root
= new TreeNode(inorder
[rootIndex
]);int leftNum
= rootIndex
- iL
;int rightNum
= iR
- rootIndex
;if(leftNum
> 0){root
.left
= toBuildTree(root
.left
, preorder
, pL
+ 1, pL
+ leftNum
, inorder
, iL
, rootIndex
- 1, map
);}if(rightNum
> 0){root
.right
= toBuildTree(root
.right
, preorder
, pL
+ leftNum
+ 1, pR
, inorder
, rootIndex
+ 1, iR
, map
);}return root
;}
}
class Solution {Map<Integer, Integer> hashmap
= new HashMap<>();public TreeNode buildTree(int[] preorder
, int[] inorder
) {for(int i
= 0; i
< inorder
.length
; i
++) {hashmap
.put(inorder
[i
], i
);}return toBuildTree(preorder
, 0, preorder
.length
- 1, inorder
, 0, inorder
.length
- 1);}public TreeNode toBuildTree(int[] preorder
, int pL
, int pR
, int[] inorder
, int iL
, int iR
) {int rootIndex
= hashmap
.get(preorder
[pL
]);TreeNode root
= new TreeNode(preorder
[pL
]);int leftNum
= rootIndex
- iL
;int rightNum
= iR
- rootIndex
;if(leftNum
> 0) {root
.left
= toBuildTree(preorder
, pL
+ 1, pL
+ leftNum
, inorder
, iL
, rootIndex
- 1);}if(rightNum
> 0) {root
.right
= toBuildTree(preorder
, pL
+ leftNum
+ 1, pR
, inorder
, rootIndex
+ 1, iR
);}return root
;}
}
總結
以上是生活随笔為你收集整理的【LeetCode笔记】105. 从前序与中序遍历序列构造二叉树(Java、递归、二叉树、哈希表)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。