前序与中序遍历序列构造二叉树
问题描述:
根据一棵树的前序遍历与中序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3 / \ 9 20 / \ 15 7
解题思路:
二叉树的先序遍历先访问根结点,其次遍历根节点的左子树,然后遍历根节点的右子树。
中序遍历,先遍历左子树,然后遍历根结点,最后遍历右子树。
因此中序遍历序列被根节点分为两部分:根结点之前的部分为左子树结点中序序列,根结点之后的为右子树结点中序序列。
例如:已知一颗二叉树的先序序列为EBADCFHG,其中序序列为ABCDEFGH。下图说明了还原二叉树的过程:
首先由先序序列知道二叉树的根结点为E,则其左子树的中序序列为ABCD,右子树的中序序列为FGH。
继而得到左子树先序序列为BADC,右子树先序序列为FHG。
重复上述步骤。
实现代码:
private static TreeNode test(int[] preorder, int p, int q, int[] inorder, int i, int j) { if (p > q) return null; if (p == q) return new TreeNode(preorder[p]); TreeNode node = new TreeNode(preorder[p]); int k = i; // 找到根节点在中序遍历序列中的位置 while (preorder[p] != inorder[k]) k++; node.left = test(preorder, p+1, p+k-i, inorder, i, k-1); node.right = test(preorder, p+k-i+1, q, inorder, k+1, j); return node; } public static TreeNode buildTree(int[] preorder, int[] inorder) { return test(preorder, 0, preorder.length-1, inorder, 0, inorder.length-1); }
posted on 2018-07-11 20:08 Deltadeblog 阅读(5064) 评论(0) 编辑 收藏 举报