JAVA程序设计:根据前序和后序遍历构造二叉树(LeetCode:889)

返回与给定的前序和后序遍历匹配的任何二叉树。

 pre 和 post 遍历中的值是不同的正整数。

 

示例:

输入:pre = [1,2,4,5,3,6,7], post = [4,5,2,6,7,3,1]
输出:[1,2,3,4,5,6,7]
 

提示:

1 <= pre.length == post.length <= 30
pre[] 和 post[] 都是 1, 2, ..., pre.length 的排列
每个输入保证至少有一个答案。如果有多个答案,可以返回其中一个。

思路:递归。对于前序遍历,我们往往能够确定当前子树的根,而在已知根的情况下,我们根据后序遍历序列可以知道以该根为子树的子树中的结点数,因此我们可以通过递归解决该题。

class Solution {
    public TreeNode constructFromPrePost(int[] pre, int[] post) {
    	
    	int n=pre.length;
    	if(n==0) return null;
    	
    	TreeNode root=new TreeNode(pre[0]);
    	if(n==1) return root;
    	
    	int index=0;
    	for(int i=0;i<n;i++)
    		if(post[i]==pre[1])
    			index=i+1;
    	
    	root.left=constructFromPrePost(Arrays.copyOfRange(pre, 1, index+1),
    			Arrays.copyOfRange(post, 0, index));
    	root.right=constructFromPrePost(Arrays.copyOfRange(pre, index+1, n),
    			Arrays.copyOfRange(post, index, n-1));
    	
    	return root;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值