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