前序中序,後序中序確定一顆二叉樹。
後序中序確定的思路:
從postorder中取出最後一個數
以這個數為分界點分割中序陣列
再根據中序的分組分割後序陣列
點選檢視程式碼
class Solution {
Map<Integer,Integer> map = new HashMap<>();
public TreeNode buildTree(int[] inorder, int[] postorder) {
for(int i = 0 ; i<inorder.length;i++){
map.put(inorder[i],i);
}
return buildnode(inorder,postorder,0,inorder.length-1,0,inorder.length-1);
}
public TreeNode buildnode(int[] inorder,int[] postorder,int l,int r,int pl,int pr){
if(l>r) return null;
int value = postorder[pr];
TreeNode root = new TreeNode(value);
int idx = map.get(value)-l;
root.left=buildnode(inorder,postorder,l,l+idx-1,pl,pl+idx-1);
root.right=buildnode(inorder,postorder,l+idx+1,r,pl+idx,pr-1);
return root;
}
}
難點在於遞迴的時候座標的變化,跟著例子捋一遍就能寫出來了。
654最大二叉樹
點選檢視程式碼
class Solution {
public TreeNode constructMaximumBinaryTree(int[] nums) {
return coustruct(nums,0,nums.length-1);
}
TreeNode coustruct(int[] nums,int l,int r){
if(l>r) return null;
int max = l;
for(int i = l+1;i<=r;i++){
if(nums[i]>nums[max]){
max = i;
}
}
TreeNode root = new TreeNode(nums[max]);
root.left=coustruct(nums,l,max-1);
root.right=coustruct(nums,max+1,r);
return root;
}
}
遞迴用最大值分割。時間複雜度為O(n²),最壞情況下為嚴格遞增或遞減。遞迴n蹭,對於第i層每層都要遍歷n-i次才能找到最大值。最佳化點就在於每輪的遍歷,如果每次新增元素就完成比較,時間複雜度就可以最佳化到O(n)。
單調棧:插入元素小於棧中元素,入棧,並把棧中元素的右指標指向入棧元素。大於,出棧直到找到不小於該元素的數,把入棧元素的左指標指向棧中元素。
程式碼明天寫
合併二叉樹。
一棵樹和兩棵樹的遍歷是一樣的,多傳一個節點就好了。
遞迴遍歷相加即可,root1==null,return root2。
也可以用佇列模擬層序遍歷對應位置相加。
,