【LeetCode每日一题】[中等]106. 从中序与后序遍历序列构造二叉树

【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;
	}
}

猜你喜欢

转载自blog.csdn.net/qq_39457586/article/details/108789685