3.9 重建二叉树

3.9 重建二叉树

基本问题 : 给你一个中序遍历序列和一个前序遍历序列,还原该二叉树。

// 3.9 重建二叉树
class Test{
	static class TreeNode{
		int val;
		TreeNode left;
		TreeNode right;
		TreeNode(){};
		TreeNode(int val){this.val = val;}
	}
	public static void main(String[] args) {

		/**
		基本问题:根据前序遍历以及中序遍历的结构重构二叉树。
		*/

		int[] preorder = new int[]{3,9,20,15,7};
		int[] inorder = new int[]{9,3,15,20,7};
		System.out.println(buildTree(preorder,inorder).val);
		
	}
	public static TreeNode buildTree(int[] preorder, int[] inorder) {
              if (preorder.length == 0 ||  inorder.length == 0 || preorder.length != inorder.length) return null;
              return help(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1);
        }

        public static TreeNode help(int[] preorder, int pStart, int pEnd, int[] inorder, int iStart, int iEnd) {
              //递归的第一步:递归终止条件,避免死循环
              if (pStart > pEnd || iStart > iEnd) return null;
              //重建根节点
              TreeNode treeNode = new TreeNode(preorder[pStart]);
              int index = 0;  //index找到根节点在中序遍历的位置
              while (inorder[iStart + index] != preorder[pStart]) index++;
              //重建左子树
              treeNode.left = help(preorder, pStart + 1, pStart + index, inorder, iStart, iStart + index - 1);
              //重建右子树
              treeNode.right = help(preorder, pStart + index + 1, pEnd, inorder, iStart + index + 1, iEnd);
              return treeNode;
          }
}

拓展问题

1 如果中序遍历序列中或者前序遍历序列中有重复元素,重构出来的二叉树是唯一的么?如果不是唯一的,如何构造出所有的解呢?

answer:不是唯一的

2 如何判断给定的前序遍历和中序遍历的结果是合理的呢?

answer :

3 如果知道前序遍历和后续遍历的结果,能重构二叉树么?

answer:不能

posted @ 2020-12-02 11:32  BOTAK  阅读(65)  评论(0编辑  收藏  举报