Leetcode 106 Construct Binary Tree from Inorder and Postorder Traversal 根据中序和后序构建二叉树

题目:

Given inorder and postorder traversal of a tree, construct the binary tree.

Note:
You may assume that duplicates do not exist in the tree.

For example, given

inorder = [9,3,15,20,7]
postorder = [9,15,7,20,3]

Return the following binary tree:

    3
   / \
  9  20
    /  \
   15   7

解决办法:

package test;

import java.util.HashMap;
import java.util.Map;

public class LC106Try1
{
	public TreeNode buildTree(int[] inorder, int[] postorder)
	{
		Map<Integer, Integer> inorderHash = new HashMap<Integer, Integer>();
		for (int i = 0; i < inorder.length; i++) { 
	        inorderHash.put(inorder[i], i);
	    }
		TreeNode node = getPass(inorderHash,postorder,0,inorder.length-1,0,postorder.length-1);
		return node;
	}
	public TreeNode getPass(Map<Integer, Integer> inorderHash, int[] postorder,int s1,int e1,int s2,int e2){
		if(s1>e1||e2<0){
			return null;
		}
		
		TreeNode root= new TreeNode(postorder[e2]);
		int k=inorderHash.get(postorder[e2]);
		int leftlen=k-s1;
		root.left=getPass(inorderHash,postorder,s1,k-1,s2,s2+leftlen-1);
		root.right=getPass(inorderHash,postorder,k+1,e1,s2+leftlen,e2-1);
		return root;
	}

}
public TreeNode buildTree(int[] inorder, int[] postorder) {
        if(postorder.length==0){
            return null;
        }
        int tag=0;
        int len=postorder.length-1;
        for(int i=0;i<inorder.length;i++){
            if(postorder[len]==inorder[i]){
                tag=i;
                break;
            }
        }
        TreeNode root=new TreeNode(postorder[len]);
        if(tag>0){
            int[] leftInorder = new int[tag];
            int[] leftPostorder = new int[tag];
            for(int i=0;i<tag;i++){
                leftInorder[i]=inorder[i];
                leftPostorder[i]=postorder[i];
            }
            root.left=buildTree(leftInorder,leftPostorder);
        }
        if(inorder.length-tag-1>0){
            int[] rightInorder = new int[inorder.length-tag-1];
            int[] rightPostorder = new int[inorder.length-tag-1];

            for(int i=0;i<inorder.length-tag-1;i++){
                rightInorder[i]=inorder[tag+i+1];
                rightPostorder[i]=postorder[tag+i];
            }
            root.right=buildTree(rightInorder,rightPostorder);
        }
        return root;

    }

 

哈哈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值