力扣889.根据前序和后序遍历构造二叉树

本文介绍如何利用前序遍历和后序遍历数组构建二叉树,重点在于理解如何通过第二个元素区分左右子树,避免越界问题,并提供代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

889.根据前序和后序遍历构造二叉树

思路:

本题思路和105,106思路略有不同,但也有相似的地方。

  1. 前序数组的第一位和后序数组的最后一位相同,都是根节点,并且一个在首位,一个在末尾,根据此根节点判断不出来 左右子树
  2. 前序数组第二个元素是左子树的根节点,在后序数组中找到该根节点即可找出 左子树范围和右子树范围。
  3. 再根据后序数组的下一个元素判断 左子树的孩子和右子树的孩子,依此类推。
注意点:
  1. 本题前序数组第一位并不能区分左右子树,所以应该 用第二个元素来区分。

  2. 用第二个元素时,递归到后面必会越界,设置条件防止越界

代码实现
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    HashMap<Integer, Integer> postHashMap = new HashMap<Integer, Integer>();
	int[] pre;
	public TreeNode constructFromPrePost(int[] preorder, int[] postorder) {
		for (int i = 0; i < postorder.length; i++) {
			postHashMap.put(postorder[i], i);
		}
		pre = preorder;
		return buildTree(0, postorder.length - 1, 0, preorder.length - 1);
    }
	
	public TreeNode buildTree(int post_start, int post_end, int pre_start, int pre_end) {
		if (post_start > post_end || pre_start > pre_end) return null;
		
		int root = pre[pre_start];
        TreeNode node = new TreeNode(root);
        if (pre_start == pre_end) return node;
		int index = postHashMap.get(pre[pre_start + 1]);
		
		
		node.left = buildTree(post_start, index, pre_start + 1, pre_start + index - post_start + 1);
		node.right = buildTree(index + 1, post_end - 1, pre_start + index - post_start + 2, pre_end);
		
		return node;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值