码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode_105_Construct Binary Tree from Preorder and Inorder Traversal

时间:2015-04-03 15:17:20      阅读:133      评论:0      收藏:0      [点我收藏+]

标签:二叉树   中序遍历   重建二叉树   

描述:

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

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

思路:

1.将中序遍历序列和其对应的下标存储到一个map中,方便下面的查找
2.递归选取前序序列的第一个元素作为树的根节点,然后查找根节点在前序序列中位置inorderIndex,inorderIndex-startInorder可以得到左子树的长度
3.根据左子树的长度和startPreOrder可以求出前序序列中左子树的起始位置
4.从上面可以求出左右子树的前序序列和中序序列的起始位置,递归调用建树过程即可。
PS:其实,对于这道题,有更简单的方法,可根据按前序序列元素出现的顺序依次作为树的根节点进行前序建树,这样要简单多了,根本不用分别计算前序和中序序列的左右子树的起始位置,哪天把这种方法的代码给补上。我的方法好繁呐,但是,我感觉更直接,而且,前序中序后序建树均可。技术分享

代码:

/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    int []ArrPreorder;
	int []ArrInorder;
    Map<Integer, Integer>mapInorder=new HashMap<Integer, Integer>();
	public TreeNode buildTree(int[] preorder, int[] inorder) {
		if(preorder.length==0||preorder==null)
			return null;
		ArrPreorder=preorder;
    	ArrInorder=inorder;
    	for(int i=0;i<inorder.length;i++)
    		mapInorder.put(inorder[i], i);
        int start=0, end=preorder.length-1;
        TreeNode root =new TreeNode(0);
        createTree(root,start,end,start, end);
        return root;
    }
	public void createTree(TreeNode root, int start1,int end1,int start2,int end2)
	{
		int subStart1=start1,subStart2=start2,subEnd1=end1,subEnd2=end2;
		int target=ArrPreorder[start1];
		int indexInOrder=mapInorder.get(target);
		int len=indexInOrder-start2;
		int indexPreOrder=start1+len;
		if(start2<=indexInOrder-1)
		{
			subStart1=start1+1;
			subEnd1=indexPreOrder;
			subEnd2=indexInOrder-1;
			root.left=new TreeNode(0);
			createTree(root.left,subStart1,start2, subStart2, subEnd2);
		}
		root.val=target;
		if(indexInOrder+1<=end2)
		{
			subStart1=indexPreOrder+1;
			subStart2=indexInOrder+1;
			root.right=new TreeNode(0);
			createTree(root.right,subStart1,end1, subStart2, end2);
		}
	}
}

结果:

技术分享

leetcode_105_Construct Binary Tree from Preorder and Inorder Traversal

标签:二叉树   中序遍历   重建二叉树   

原文地址:http://blog.csdn.net/mnmlist/article/details/44855241

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!