【劍指offer】【4】根據前序和中序結果,重建二叉樹
題目:
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹並返回。
1、分析原理:
根據前序和中序的特性,前序序列的一個元素就是樹的根元素,那麼在中序序列找到相應的元素。找到後該元素前面所有元素都是左子樹元素,後面元素都是右子樹元素。那麼此時跟節點的pleft就是左子樹返回的結果,pright就是右子樹返回的結果,使之遞迴即可,遞迴出口就是前序區間只有一個元素時。
2、思路一:前序和中序必須結合搭配
使用遞迴,每次分清根結點、左子樹、右子樹,遞迴進行構建。
先序遍歷第一個位置肯定是根節點node,中序遍歷的根節點位置在中間p,在p左邊的肯定是node的左子樹的中序陣列,p右邊的肯定是node的右子樹的中序陣列。
重構函式(前序陣列,前序陣列頭,前序陣列尾,中序陣列,中序陣列頭,中序陣列尾);
根據前序陣列的第一個值遍歷中序陣列,找到之後即可分清前序和中序陣列中左子樹和右子樹的組成部分,得到四個新的陣列。
新左子樹:前序部分、中序部分
新右子樹:前序部分、中序部分
注意:陣列的邊界
找到左右子樹之後,當成新的前序中序陣列傳入重構函式進進一步構建,遞迴!
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left; //左子樹
* TreeNode right; //右子樹
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public TreeNode reConstructBinaryTree(int [] pre,int [] in) { //輸入前序中序陣列
return reConBTree(pre,0,pre.length-1,in,0,in.length-1);
}
//使用遞迴不斷尋找根節點、左子樹、右子樹
//每次都輸入新的樹的前序和後序陣列
public TreeNode reConBTree(int[] pre, int preleft, int preright, int[] in, int inleft, int inright){
if(preleft > preright || inleft > inright){ //陣列遍歷完畢
return null;
}
//新建一個TreeBTree
TreeNode root = new TreeNode(pre[preleft]);
//遍歷中序陣列,找到根節點,和左右子樹
for(int i=0; i < in.length; i++){
if(in[i] == pre[preleft]){
//重構左子樹,使用遞迴
root.left = reConBTree(pre, preleft+1, preleft+i-inleft, in, inleft, i-1);
//重構右子樹,使用遞迴
root.right = reConBTree(pre, preleft+i-inleft+1, preright, in, i+1, inright);
}
}
return root;
}
}
相關文章
- 劍指offer:輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。二叉樹
- 根據前序遍歷序列、中序遍歷序列,重建二叉樹二叉樹
- 劍指offer——重建二叉樹二叉樹
- 劍指offer(四)重建二叉樹二叉樹
- 劍指 Offer 07. 重建二叉樹二叉樹
- 根據二叉樹的前序遍歷和中序遍歷輸出二叉樹;二叉樹
- 【根據前序和中序遍歷構造二叉樹】棧+迭代 || 遞迴二叉樹遞迴
- 889. 根據前序和後序遍歷構造二叉樹二叉樹
- Leetcode 889. 根據前序和後序遍歷構造二叉樹LeetCode二叉樹
- 劍指offer(java實現)第4題“重建二叉樹”-牛客網Java二叉樹
- [劍指offer] 二叉搜尋樹的後序遍歷序列
- 二叉樹的前序,中序,後序遍歷方法總結二叉樹
- 【劍指offer】5.二叉樹的映象和列印二叉樹
- 二叉樹 ---- 前序 中序 後序 知二求一二叉樹
- 劍指 Offer 33. 二叉搜尋樹的後序遍歷序列
- 劍指Offer-40-二叉樹的深度二叉樹
- [劍指offer] 把二叉樹列印成多行二叉樹
- 劍指offer——二叉樹的深度C++二叉樹C++
- 【劍指offer】27. 二叉樹的映象二叉樹
- 劍指offer——二叉樹的映象C++二叉樹C++
- 從前序與中序構造二叉樹二叉樹
- 二叉樹的前序、中序、後序的遞迴和迭代實現二叉樹遞迴
- 二叉樹的前序、中序、後序三種遍歷二叉樹
- 劍指offer | 55 - I. 二叉樹的深度二叉樹
- 力扣 - 劍指 Offer 27. 二叉樹的映象力扣二叉樹
- 二叉樹迭代器(中序遞迴、前序和後序遍歷)演算法二叉樹遞迴演算法
- 53. 最大子序和(劍指 Offer 42)
- [資料結構] 根據前中後序遍歷中的兩種構造二叉樹資料結構二叉樹
- 劍指offer-17:樹的子結構
- 劍指offer--把二叉樹列印成多行(C++)二叉樹C++
- # 劍指 Offer 68 - II. 二叉樹的最近公共祖先二叉樹
- 《劍指offer》之在完全二叉樹中新增子節點二叉樹
- 劍指offer——從上往下列印二叉樹C++二叉樹C++
- 【資料結構與演算法】二叉樹的 Morris 遍歷(前序、中序、後序)資料結構演算法二叉樹
- (python版)《劍指Offer》JZ57:二叉樹的下一個結點Python二叉樹
- 144. 二叉樹的遍歷「前序、中序、後序」 Golang實現二叉樹Golang
- leetcode 102 劍指Offer 32 二叉樹的層次遍歷LeetCode二叉樹
- 劍指 Offer 32 - III. 從上到下列印二叉樹 III二叉樹