https://www.nowcoder.com/practice/8a19cbe657394eeaac2f6ea9b0f6fcf6
这道题有一定难度,学习下如何构建和遍历二叉树。
递归
思路:
对于二叉树的前序遍历,我们知道序列的第一个元素必定是根节点的值,因为序列没有重复的元素,因此中序遍历中可以找到相同的这个元素,而我们又知道中序遍历中根节点将二叉树分成了左右子树两个部分,我们可以发现,数字1是根节点,并将二叉树分成了(247)和(3568)两棵子树,而子树的的根也是相应前序序列的首位,比如左子树的根是数字2,右子树的根是数字3,这样我们就可以利用前序遍历序列找子树的根节点,利用中序遍历序列区分每个子树的节点数。
- step 1:先根据前序遍历第一个点建立根节点。
- step 2:然后遍历中序遍历找到根节点在数组中的位置。
- step 3:再按照子树的节点数将两个遍历的序列分割成子数组,将子数组送入函数建立子树。
step 4:直到子树的序列长度为0,结束递归。
public class Reconstruct_binary_tree {public static class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int x) {val = x;}}public static void main(String[] args) {TreeNode rootNode = reConstructBinaryTree(new int[]{1, 2, 4, 7, 3, 5, 6, 8}, new int[]{4, 7, 2, 1, 5, 3, 8, 6});System.out.println("over!");}public static TreeNode reConstructBinaryTree(int[] pre, int[] vin) {//递归结束条件if (pre.length == 0 || vin.length == 0) {return null;}TreeNode rootNode = new TreeNode(pre[0]);//根结点for (int i = 0; i < vin.length; i++) {if (pre[0] == vin[i]) { //遍历找到根结点在中序的位置rootNode.left = reConstructBinaryTree(Arrays.copyOfRange(pre, 1, i + 1), Arrays.copyOfRange(vin, 0, i)); //左子树rootNode.right = reConstructBinaryTree(Arrays.copyOfRange(pre, i + 1, pre.length), Arrays.copyOfRange(vin, i + 1, vin.length)); //右子树break;}}return rootNode;}}
