LeetCode Construct Binary Tree from Preorder and Inorder Traversal

题目:

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

题意:

根据一棵树的前序遍历和中序遍历结果,来构建一棵二叉树。

题解:

首先此题一般用递归来做,怎么分析出用递归呢?此题在《剑指offer》一书中,有讲到。因为在前序遍历中,第一个节点往往是根节点,那么我们在中序遍历的序列中也找到这个根节点,找到以后,那么在中序遍历的这个根节点之前的所有节点则都是二叉树的左子树,而这个根节点之后的所有节点则都是这棵二叉树的右子树。同理,找到二叉树的左右子树后,再递归的查找相应各自子树的左右子树。但是在设计此题的时候,要特别注意的是,建树的那个函数,其中的参数变量,其中要注意的是,每一次都会返回各自子树的长度,如果子树的长度为0,那么我们就直接返回空,如果长度为1,那么我们就返回那个节点。其实也很好理解,如果为0;其实这两个也是递归结束的条件,一般我们把这些条件放到递归的开始,这样就能够保证先判断,而不做一些没必要的递归工作。

public class Solution 
{
    public TreeNode buildTree(int[] preorder,int[] inorder)
	{
	    if(preorder == null || inorder == null || preorder.length == 0 || inorder.length == 0 || preorder.length != inorder.length)
			return null;
		return Contruct(preorder,0,inorder,inorder.length-1,inorder.length);
	}
	public TreeNode Contruct(int[] p1,int start,int[] p2,int end,int length)
	{
		
		if(length == 0)
		   return null;
		int value = p1[start];
		TreeNode root = new TreeNode(value);
		if(length == 1)
			return root;
		int i = 0; 
		while(i < length)    //这里是用来在中序遍历中查找根节点
		{
			if(p2[end - i] == value)
				break;
			i++;        //注意,这里是从尾巴开始往前找
		}
		
		root.left = Contruct(p1,start + 1,p2,end - i - 1,length - 1 - i);  //注意其中的一些参数的意义和值,最后的那个参数表示各自序列的长
		root.right = Contruct(p1,start + length - i,p2,end,i);   //尤其是最后两个,最后第二个参数表示的是中序遍历开始的那个节点
		return root;
	}
}
可以看到,这题很巧妙的利用了end,这个表示原来序列的尾节点的位置,然后利用从尾巴开始往前找,然后计算得到那个i,就可以做了。很好的利用递归,是一道很经典的题目。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值