【LeetCode每日一题】[中等]106. 从中序与后序遍历序列构造二叉树
106. 从中序与后序遍历序列构造二叉树
题目来源
算法思想:树,递归
题目:
java代码
class Solution {
public TreeNode buildTree(int[] inorder, int[] postorder) {
//递归生成二叉树
return dfsbuild(inorder, postorder, postorder.length-1, 0, inorder.length);
}
private TreeNode dfsbuild(int[] inorder, int[] postorder, int key, int start, int end) {
//当前数组<start,end>为空,返回null;
if(start >= end) {
return null;
}
//在中序数组中找到后序数组中(根)root的下标minIndex,
//将中序数组进行划分,<start,minIndex>为root的左子树节点;
//<minIndex+1,end>为root的右子树节点;
int minIndex = -1;
for (int i = start; i < end; i++) {
if (inorder[i] == postorder[key]) {
minIndex = i;
}
}
int rightcount = end - 1 - minIndex;//右子树结点数量,用来确定左子树数组的边界,
TreeNode root = new TreeNode(postorder[key]);//生成当前根节点
//右子树递归生成,根节点为后序遍历的key-1,区域为中序遍历的<minIndex+1,end>
root.right = dfsbuild(inorder, postorder, key-1, minIndex+1, end);
//左子树递归生成,根节点为后序遍历的end - 1 - minIndex,区域为中序遍历的<start,minIndex>
root.left = dfsbuild(inorder, postorder, key-(rightcount)-1, start, minIndex);
return root;
}
}