java二叉树合并_Java(树的前中后序遍历构造二叉树题型整合)前序和中序、中序和后序、前序和后序遍历序列构造二叉树算法整合归纳...
前言
二叉樹各種花里胡哨的算法題真的把我搞暈了,今天特地整理出一類有關二叉樹的算法題,希望能幫助閱讀到此文章的人,今后不再受此類題型的困擾。
一、題目類型
已知二叉樹的兩種遍歷序列,請根據該序列構建二叉樹;
①根據一棵樹的前序遍歷與中序遍歷構造二叉樹。
前序遍歷 preorder = [3,9,20,15,7]
中序遍歷 inorder = [9,3,15,20,7]
力扣105題
②根據一棵樹的中序遍歷與后序遍歷構造二叉樹。
中序遍歷 inorder = [9,3,15,20,7]
后序遍歷 postorder = [9,15,7,20,3]
力扣106題
③根據一棵樹的前序遍歷與后序遍歷構造二叉樹。
前序遍歷 inorder = [1,2,4,5,3,6,7]
后序遍歷 postorder = [4,5,2,6,7,3,1]
力扣889題
二、題型規律
規律啥的基本上大家都看的出來,無非就是根據手握兩種遍歷序列,去構建二叉樹。
這題的變化點個人感覺就是給你的遍歷序列,可能是字符串,可能是數組,也可能是集合,那么中間就還存在一個把序列給轉換成方便我們使用的狀態,例如字符串通過正則分割,然后轉換為數組啥的(本文章的遍歷序列是數組形式),過分點就是二叉樹的結點類也要你自己寫。那么節點類就這么寫↓
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
三、解題套路
1.明確序列分工(結點構建序列,左右子結點判斷序列)
題目給了兩個序列,我們得先明確,兩個序列分別做什么工作。
第一,構建一棵二叉樹一般都是從根節點開始往下構建子樹(我目前沒見過從子樹開始往上構建到根節點的情況,但不知道有沒有,話不敢說絕對,嘿嘿),既然要從根節點開始往下構建,那我們就需要一個能從根節點開始往下讀取子節點的序列,符合這個要求的序列有前序遍歷和后序遍歷(后序遍歷你倒著來看,就相當于一個改版的前序遍歷:根,右,左);
第二,我們還需要一個序列,來確定我們讀取的結點到底是左結點還是右結點。此時我們就需要中序遍歷,如果沒有中序遍歷,就用后續遍歷;
總結:結點構建序列:前序、后序;左右子結點判斷序列:中序、后序;
2.構建結點下標查詢表
將左右子結點判斷序列每個節點存入哈希表中,方便我們查詢下標
3.根據結點構建序列逐個構建結點(遞歸實現)
然后按照結點構建序列逐個構建結點,通過左右子節點判斷序列判斷當前構建的結點屬于左結點還是右結點;
四、代碼實現
①根據一棵樹的前序遍歷與中序遍歷構造二叉樹。
class Solution {
Map map = new HashMap<>();
int index = 0;
public TreeNode buildTree(int[] preorder, int[] inorder) {
for(int i = 0; i < inorder.length; i++){
map.put(inorder[i], i);
}
return build(0, preorder.length - 1, preorder);
}
public TreeNode build(int left, int right, int[] preorder){
if(left > right) return null;
int mid = map.get(preorder[index]);
TreeNode root = new TreeNode(preorder[index]);
index++;
root.left = build(left, mid - 1, preorder);
root.right = build(mid + 1, right, preorder);
return root;
}
}
②根據一棵樹的中序遍歷與后序遍歷構造二叉樹。
class Solution {
Map map = new HashMap<>();
int index = 0;
public TreeNode buildTree(int[] inorder, int[] postorder) {
for(int i = 0; i < inorder.length; i++){
map.put(inorder[i], i);
}
index = postorder.length - 1;
return build(0, postorder.length - 1, postorder);
}
public TreeNode build(int left, int right, int[] postorder){
if(left > right) return null;
int mid = map.get(postorder[index]);
TreeNode root = new TreeNode(postorder[index]);
index--;
root.left = build(left, mid - 1, postorder);
root.right = build(mid + 1, right, postorder);
return root;
}
}
③根據一棵樹的前序遍歷與后序遍歷構造二叉樹。
class Solution {
Map map = new HashMap<>();
int index = 0;
public TreeNode constructFromPrePost(int[] preorder, int[] postorder) {
for(int i = 0; i < postorder.length; i++){
map.put(postorder[i], i);
}
return build(0, postorder.length - 1, preorder);
}
public TreeNode build(int left, int right, int[] preorder){
if(left > right || index >= preorder.length) return null;
TreeNode root = new TreeNode(preorder[index]);
index++;
if(index < preorder.length && left < right){
int mid = map.get(preorder[index]);
root.left = build(left, mid, preorder);
root.right = build(mid + 1, right - 1, preorder);
}
return root;
}
}
總結
觀察三種題型的解題代碼,其實有很多相同之處,唯獨后序遍歷的遞歸算法有稍微一些變形,這三個代碼可以一起理解,勤加練習,這類題型問題就不大了
本文分享 CSDN - 彈彈霹靂。
如有侵權,請聯系 support@oschina.cn 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。
總結
以上是生活随笔為你收集整理的java二叉树合并_Java(树的前中后序遍历构造二叉树题型整合)前序和中序、中序和后序、前序和后序遍历序列构造二叉树算法整合归纳...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python的类方法_python 类不
- 下一篇: arduino麦轮转弯程序_麦克纳姆轮智