106.Construct Binary Tree from Inorder and Postorder Traversal

题目描述(中等难度)

在这里插入图片描述

思路分析

可以先看一下 105 题,直接在 105 题的基础上改了,大家也可以先根据 105 题改一改。

105 题给的是先序遍历和中序遍历,这里把先序遍历换成了后序遍历。

区别在于先序遍历的顺序是 根节点 -> 左子树 -> 右子树。

后序遍历的顺序是 左子树 -> 右子树 -> 根节点。

我们当然还是先确定根节点,然后在中序遍历中找根节点的位置,然后分出左子树和右子树。

对于之前的解法一,传数组的两个边界,影响不大,只要重新计算边界就可以了。

解法一

常规解法,利用递归,传递左子树和右子树的数组范围即可。

import java.util.HashMap;

class TreeNode{
	int val;
	TreeNode left;
	TreeNode right;
	TreeNode(int x){val=x;}
}

public class Construct_Binary_Tree_from_Inorder_and_Postorder_Traversal {
	
	public static TreeNode buildTree(int[]inorder,int[]postorder) {
		HashMap<Integer,Integer>map=new HashMap<>();
		for(int i=0;i<inorder.length;i++) {
			map.put(inorder[i],i);
		}
		return builderTreeHelper(inorder,0,inorder.length,postorder,0,postorder.length,map);
	}

	private static TreeNode builderTreeHelper(int[] inorder, int i_start, int i_end, int[] postorder, int p_start, int p_end,HashMap<Integer,Integer>map) {
		
		if(p_start==p_end) return null;
		int root_val=postorder[p_end-1];
		TreeNode root=new TreeNode(root_val);
		int i_root_index=map.get(root_val);
		int leftNum=i_root_index-i_start;
		root.left = builderTreeHelper(inorder, i_start, i_root_index, postorder, p_start, p_start + leftNum, map);
	    root.right = builderTreeHelper(inorder, i_root_index + 1, i_end, postorder, p_start + leftNum, p_end - 1,map);
		return root;
	}
	public static void main(String args[]) {
		int[] preorder= {9,3,15,20,7};
		int[] inorder= {9,15,7,20,3};
		
		TreeNode ans=buildTree(preorder,inorder);
		System.out.println(ans.val);
	}
}

在这里插入图片描述

参考文献

1.https://zhuanlan.zhihu.com/p/74277078

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安替-AnTi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值