Construct Binary Tree from Inorder and Postorder Traversal (M)
題目
Given inorder and postorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
For example, given
inorder = [9,3,15,20,7]
postorder = [9,15,7,20,3]
Return the following binary tree:
3
/ \
9 20
/ \
15 7
題意
給定一棵二叉樹的后序序列和中序序列,要求重建這棵二叉樹,
思路
由二叉樹的性質可知,后序序列的最后一個元素是當前二叉樹的根節點,根節點將中序序列分為左子樹和右子樹,后序序列的最后一個元素即為整棵二叉樹的根節點,在中序序列中找到該元素,則中序中該元素左側為左子樹,右側為右子樹,依照左右子樹個數又可將后序序列剩余元素進行劃分,接著只要對左子樹和右子樹進行遞回操作即可,
代碼實作
Java
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode buildTree(int[] inorder, int[] postorder) {
// 為了省去在中序序列中迭代查找元素的時間, 直接用HashMap將整個inorder存進去
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < inorder.length; i++) {
map.put(inorder[i], i);
}
return buildTree(map, 0, inorder.length - 1, postorder, 0, postorder.length - 1);
}
private TreeNode buildTree(Map<Integer, Integer> map, int inI, int inJ, int[] postorder, int postI, int postJ) {
// 遞回邊界
if (postI > postJ) {
return null;
}
if (postI == postJ) {
return new TreeNode(postorder[postJ]);
}
// 在中序序列中找到后序序列的最后一個元素,并求出左子樹的長度
int len = map.get(postorder[postJ]) - inI;
TreeNode root = new TreeNode(postorder[postJ]);
// 劃磁區域后遞回處理左右子樹
root.left = buildTree(map, inI, inI + len - 1, postorder, postI, postI + len - 1);
root.right = buildTree(map, inI + len + 1, inJ, postorder, postI + len, postJ - 1);
return root;
}
}
JavaScript
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {number[]} inorder
* @param {number[]} postorder
* @return {TreeNode}
*/
var buildTree = function (inorder, postorder) {
return dfs(inorder, 0, inorder.length - 1, postorder, 0, postorder.length - 1)
}
let dfs = function (inorder, inL, inR, postorder, postL, postR) {
if (inL > inR) {
return null
}
let last = postorder[postR]
let root = new TreeNode(last)
let pos = inL
while (inorder[pos] !== last) {
pos++
}
root.left = dfs(inorder, inL, pos - 1, postorder, postL, postL + pos - inL - 1)
root.right = dfs(inorder, pos + 1, inR, postorder, postL + pos - inL, postR - 1)
return root
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/10641.html
標籤:其他
上一篇:交換排序演算法之冒泡排序
