LeetCode105题:从前序和中序遍历序列构造二叉树

版权声明:本文为博主原创文章,转载请注明出处! https://blog.csdn.net/ASN_forever/article/details/85173064

思路: 

首先要清楚二叉树的前序遍历和中序遍历的过程。所谓的前序遍历,其遍历顺序为:当前节点-->左子树-->右子树;而中序遍历的遍历顺序为:左子树-->当前节点-->右子树。因此,中序遍历序列中某一节点的左右两侧则分别为其左右子树。这样思路就出来了,先在前序遍历序列中设定当前节点,然后在中序遍历序列中遍历找到当前节点,然后对其左右子树(即左右两侧的局部序列)分别进行递归调用即可。

对于递归问题,关键是确定什么时候递归以及什么时候结束递归。对于此问题,进行递归的条件就是当在中序遍历序列中找到当前节点时即进行递归;而结束递归的条件稍微难确定一点,对于不同的代码可能有所区别。我这里是当中序遍历的局部子序列长度小于等于1时结束递归,这时候说明当前节点没有左子树或没有右子树。

class Solution {

    public TreeNode buildTree(int[] preorder, int[] inorder) {
        return helpBuild(preorder, inorder, 0, 0, inorder.length);
    }

    public static TreeNode helpBuild(int[] pre,int[] in,int preIndex,int inFrom,int inTo){
		if(inFrom >= inTo){//说明左子树或右子树为空
			return null;
		}
		TreeNode root = new TreeNode(pre[preIndex]);
		for(int i=inFrom;i<inTo;i++){//中序序列寻找当前节点
			if(in[i] == pre[preIndex]){
				root.left = helpBuild(pre, in, preIndex + 1, inFrom, i);//对左子树进行递归
				root.right = helpBuild(pre, in, preIndex + i - inFrom + 1, i+1, inTo);
                break;
			}
		}
		return root;
	}

猜你喜欢

转载自blog.csdn.net/ASN_forever/article/details/85173064
今日推荐