Leetcode---从前序与中序遍历序列构造二叉树--思路

从前序与中序遍历序列构造二叉树

题目链接:从前序与中序遍历序列构造二叉树

解题思路:
  • 从遍历序列构造二叉树时,必须包含有中序遍历,先序和后序是构造不了的
  • 方法:首先找先序的第一个节点,它一定是树的根节点,然后在中序序列中找到该节点的位置,左边即为该节点的左子树遍历序列,右边则为右子树遍历序列
  • 再去构造子树时,我们发现典型的递归构造
  • 那么构造单独一个节点时,我们需要的是什么?只需要当前遍历的先序序列的节点(可以用数组和下标来表示),中序序列中的部分序列(这棵子树在中序序列中的范围,用中序序列和front,rear下标表示即可)
  • front>rear时表明该树为空,相等时表示该树仅有一个节点,其余情况应当继续递归,代码如下:
public TreeNode buildTree(int[] preorder, int[] inorder) {
		
		int front = 0,rear = preorder.length-1,index = 0;
		return buildTree(inorder,front,rear,preorder,index);
    }
	TreeNode buildTree(int[] inorder, int front,int rear,int[] preorder,int index) {
		
		if(front>rear) {
			//当前节点应当为空
			return null;
		}else if(front==rear) {
			//只含有一个根节点
			return new TreeNode(inorder[front]);
		}
		//在front到rear范围内遍历inorder[i] = preorder[index]
		int mid = 0;
		for(int i = front;i<=rear;i++) {
			if(inorder[i]==preorder[index]) {
				mid = i;
				break;
			}
		}
		int front1 = front,rear1 = mid-1,front2 = mid+1,rear2 = rear;
		//构造当前节点
		TreeNode node = new TreeNode(inorder[mid]);
		//构造左子树
		node.left = buildTree(inorder,front1,rear1,preorder,index+1);
		//构造右子树
		node.right = buildTree(inorder,front2,rear2,preorder,index+rear1-front1+2);
		return node;
	}

猜你喜欢

转载自blog.csdn.net/tiaochewang219/article/details/84586301