Skip to content
本页目录

0106-从中序与后序遍历序列构造二叉树

https://leetcode.cn/problems/construct-binary-tree-from-inorder-and-postorder-traversal

给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。

示例 1:

输入:inorder = [9,3,15,20,7], postorder = [9,15,7,20,3]
输出:[3,9,20,null,null,15,7]

示例 2:

输入:inorder = [-1], postorder = [-1]
输出:[-1]

提示:

1 <= inorder.length <= 3000
postorder.length == inorder.length
-3000 <= inorder[i], postorder[i] <= 3000
inorder 和 postorder 都由 不同 的值组成
postorder 中每一个值都在 inorder 中
inorder 保证是树的中序遍历
postorder 保证是树的后序遍历

思路

中序遍历: 左根右 后续遍历: 左右根

后续遍历的最后一个数字就是 root 节点,用其从中序节点中找到位置,再从后续遍历中找到界限。 然后递归遍历构造出树的节点。 因为每个节点的数值都不相同,因此可以使用哈希表加速寻找索引

参考代码

csharp
public class Solution {

	private Dictionary<int,int> inorderDict = new Dictionary<int,int>();

	private TreeNode BuildNode(int[] inorder, int inorderStart, int inorderEnd, int[] postorder, int postorderStart, int postorderEnd){
		if(inorderStart > inorderEnd){
			return null;
		}
		//找出根节点
		int rootValue = postorder[postorderEnd];
		//找出中序索引
		int inorderIndex = inorderDict[rootValue];
		TreeNode node = new TreeNode(rootValue);
		//构造左节点
		node.left = BuildNode(inorder,inorderStart,inorderIndex-1,postorder,postorderStart,postorderStart + inorderIndex - inorderStart -1);
		//构造右节点
		node.right = BuildNode(inorder,inorderIndex+1,inorderEnd,postorder,postorderStart+inorderIndex - inorderStart,postorderEnd-1);
		return node;
	}

    public TreeNode BuildTree(int[] inorder, int[] postorder) {
    	for(int i=0; i<inorder.Length;i++){
    		inorderDict.Add(inorder[i],i);
    	}
    	return BuildNode(inorder,0,inorder.Length-1,postorder,0,postorder.Length-1);
    }
}

Released under the MIT License.