生活随笔
收集整理的這篇文章主要介紹了
[剑指offer][JAVA]面试题第[07]题[重建二叉树][递归]
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【問題描述】[中等]
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重復的數字。例如,給出前序遍歷 preorder = [3,9,20,15,7]
中序遍歷 inorder = [9,3,15,20,7]
返回如下的二叉樹:3/ \9 20/ \15 7
【解答思路】
1. 遞歸解釋1
關鍵要理解
前序遍歷的左右子樹根節點 可以根據中序遍歷得到的左右子樹的長度推斷
時間復雜度:O(N) 空間復雜度:O(N)
import java
.util
.HashMap
;
import java
.util
.Map
;class TreeNode {int val
;TreeNode left
;TreeNode right
;TreeNode(int x
) {val
= x
;}
}public class Solution {private Map
<Integer, Integer> reverses
;private int[] preorder
;public TreeNode
buildTree(int[] preorder
, int[] inorder
) {int preLen
= preorder
.length
;int inLen
= inorder
.length
;if (preLen
!= inLen
) {return null
;}this.preorder
= preorder
;reverses
= new HashMap<>(inLen
);for (int i
= 0; i
< inLen
; i
++) {reverses
.put(inorder
[i
], i
);}return buildTree(0, preLen
- 1, 0, inLen
- 1);}private TreeNode
buildTree(int preL
, int preR
,int inL
, int inR
) {if (preL
> preR
|| inL
> inR
) {return null
;}int pivot
= preorder
[preL
];TreeNode root
= new TreeNode(pivot
);int pivotIndex
= reverses
.get(pivot
);root
.left
= buildTree(preL
+ 1, preL
+ (pivotIndex
- inL
), inL
, pivotIndex
- 1);root
.right
= buildTree(preL
+ (pivotIndex
- inL
) + 1, preR
, pivotIndex
+ 1, inR
);return root
;}
}
2. 遞歸解釋2
時間復雜度:O(N) 空間復雜度:O(N)
HashMap
<Integer, Integer> map
= new HashMap<>();int[] preorder
;public TreeNode
buildTree(int[] preorder
, int[] inorder
) {this.preorder
= preorder
;for (int i
= 0; i
< preorder
.length
; i
++) {map
.put(inorder
[i
], i
);}return recursive(0,0,inorder
.length
-1);}public TreeNode
recursive(int pre_root_idx
, int in_left_idx
, int in_right_idx
) {if (in_left_idx
> in_right_idx
) {return null
;}TreeNode root
= new TreeNode(preorder
[pre_root_idx
]);int idx
= map
.get(preorder
[pre_root_idx
]);root
.left
= recursive(pre_root_idx
+ 1, in_left_idx
, idx
- 1);root
.right
= recursive(pre_root_idx
+ (idx
-1 - in_left_idx
+1) + 1, idx
+ 1, in_right_idx
);return root
;}
【總結】
1.前中后序遍歷變化的是[中]的位置,左到右的順序不改變
2.前序+中序遍歷可畫出原二叉樹
3. 多畫圖 寫寫寫 遍歷代碼 手撕變量 大腦保持清醒
轉載鏈接:https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof/solution/mian-shi-ti-07-zhong-jian-er-cha-shu-di-gui-fa-qin/
來源:力扣(LeetCode)
轉載鏈接:https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof/solution/er-cha-shu-de-qian-xu-bian-li-fen-zhi-si-xiang-by-/
來源:力扣(LeetCode)
總結
以上是生活随笔為你收集整理的[剑指offer][JAVA]面试题第[07]题[重建二叉树][递归]的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。