106. 從中序與後序遍歷序列構造二叉樹——Java實現
題目描述:
根據一棵樹的中序遍歷與後序遍歷構造二叉樹。
注意:
你可以假設樹中沒有重複的元素。
例如,給出
中序遍歷 inorder = [9,3,15,20,7]
後序遍歷 postorder = [9,15,7,20,3]
返回如下的二叉樹:
Java程式碼:
核心程式碼:
private Map<Integer, Integer> inMap;
public TreeNode myBuildTree(int[] inorder, int[] postorder, int istart, int iend, int pstart, int pend){
if(pstart > pend)
return null;
int post_root = pend;
int in_root = inMap.get(postorder[post_root]);
int num = in_root - istart;
TreeNode root = new TreeNode(postorder[post_root]);
root.left = myBuildTree(inorder, postorder, istart, in_root-1, pstart, pstart+num-1);
root.right = myBuildTree(inorder, postorder, in_root+1, iend, pstart+num, pend-1);
return root;
}
public TreeNode buildTree(int[] inorder, int[] postorder){
int n = inorder.length;
inMap = new HashMap<>();
for(int i=0; i < n; i++){
inMap.put(inorder[i], i);
}
return myBuildTree(inorder, postorder, 0, n-1, 0, n-1);
}
全部程式碼:
package com.renxia;
import sun.reflect.generics.tree.Tree;
import java.util.HashMap;
import java.util.Map;
public class oneZeroSix {
private static Map<Integer, Integer> inMap;
public static class TreeNode{
int val;
TreeNode left;
TreeNode right;
public TreeNode(int val){
this.val = val;
}
}
public static TreeNode myBuildTree(int[] inorder, int[] postorder, int istart, int iend, int pstart, int pend){
if(pstart > pend)
return null;
int post_root = pend;
int in_root = inMap.get(postorder[post_root]);
int num = in_root - istart;
TreeNode root = new TreeNode(postorder[post_root]);
root.left = myBuildTree(inorder, postorder, istart, in_root-1, pstart, pstart+num-1);
root.right = myBuildTree(inorder, postorder, in_root+1, iend, pstart+num, pend-1);
return root;
}
public static TreeNode buildTree(int[] inorder, int[] postorder){
int n = inorder.length;
inMap = new HashMap<>();
for(int i=0; i < n; i++){
inMap.put(inorder[i], i);
}
return myBuildTree(inorder, postorder, 0, n-1, 0, n-1);
}
public static void preOrder(TreeNode root){
if(root == null)
return;
System.out.print(root.val + " ");
preOrder(root.left);
preOrder(root.right);
}
public static void main(String[] args) {
int[] inorder = new int[]{9, 3, 15, 20, 7};
int[] postorder = new int[]{9, 15, 7, 20, 3};
TreeNode root = buildTree(inorder, postorder);
preOrder(root);
}
}
執行結果:
【此處用先序遍歷驗證構造二叉樹的正確性】
相關文章
- 從中序與後序遍歷序列構造二叉樹二叉樹
- LeetCode-106-從中序與後序遍歷序列構造二叉樹LeetCode二叉樹
- LeetCode 105. 從前序與中序遍歷序列構造二叉樹LeetCode二叉樹
- LeetCode-105-從前序與中序遍歷序列構造二叉樹LeetCode二叉樹
- LeetCode 105. 從前序與中序遍歷序列構造二叉樹 | PytLeetCode二叉樹
- 演算法 -- 實現二叉樹先序,中序和後序遍歷演算法二叉樹
- 388,先序遍歷構造二叉樹二叉樹
- 先序、中序、後序序列的二叉樹構造演算法二叉樹演算法
- 根據前序遍歷序列、中序遍歷序列,重建二叉樹二叉樹
- 144. 二叉樹的遍歷「前序、中序、後序」 Golang實現二叉樹Golang
- 遞迴和迭代實現二叉樹先序、中序、後序和層序遍歷遞迴二叉樹
- 二叉搜尋樹的後序遍歷序列
- 刷題系列 - 中序和後序遍歷佇列,構造對應二叉樹;佇列二叉樹
- 二叉樹--後序遍歷二叉樹
- 二叉樹中序和後序遍歷表示式二叉樹
- 中序線索二叉樹的構造和遍歷二叉樹
- 從前序與中序構造二叉樹二叉樹
- 二叉樹的前序、中序、後序三種遍歷二叉樹
- 二叉樹的四種遍歷方法:先序,中序,後序,層序二叉樹
- 二叉樹的先中後序遍歷二叉樹
- 二叉樹的先,中,後序遍歷二叉樹
- 二叉樹的前中後序遍歷二叉樹
- 889. 根據前序和後序遍歷構造二叉樹二叉樹
- 二叉樹的前序,中序,後序遍歷方法總結二叉樹
- 144.二叉樹的前序遍歷145.二叉樹的後序遍歷 94.二叉樹的中序遍歷二叉樹
- 【資料結構與演算法】二叉樹的 Morris 遍歷(前序、中序、後序)資料結構演算法二叉樹
- 程式碼隨想錄演算法訓練營第第18天 | 513.找樹左下角的值 、112. 路徑總和 、106.從中序與後序遍歷序列構造二叉樹演算法二叉樹
- Leetcode 889. 根據前序和後序遍歷構造二叉樹LeetCode二叉樹
- 二叉樹:構造二叉樹(通過前序和中序遍歷)、映象翻轉、層次遍歷二叉樹
- [劍指offer] 二叉搜尋樹的後序遍歷序列
- JZ-023-二叉搜尋樹的後序遍歷序列
- [資料結構] 根據前中後序遍歷中的兩種構造二叉樹資料結構二叉樹
- [資料結構]二叉樹的前中後序遍歷(遞迴+迭代實現)資料結構二叉樹遞迴
- python-二叉樹:前、中、後、層序遍歷Python二叉樹
- 【演算法】二叉樹、N叉樹先序、中序、後序、BFS、DFS遍歷的遞迴和迭代實現記錄(Java版)演算法二叉樹遞迴Java
- 中序線索二叉樹的建立與遍歷二叉樹
- Java中用遞迴和迭代實現二叉樹的中序( InOrder )遍歷Java遞迴二叉樹
- PHP基於非遞迴演算法實現先序、中序及後序遍歷二叉樹操作示例PHP遞迴演算法二叉樹