zoukankan      html  css  js  c++  java
  • 剑指offer第二版-7.重建二叉树

    描述:输入某二叉树的前序遍历和中序遍历结果,重建该二叉树。假设前序遍历或中序遍历的结果中无重复的数字。

    思路:前序遍历的第一个元素为根节点的值,据此将中序遍历数组拆分为左子树+root+右子树,前序遍历数组拆分为root+左子树+右子树。再对左右子树进行同样的操作。

    考点:对二叉树不同遍历方法的掌握。

    /**
     * Copyright(C) 2019 Hangzhou Differsoft Co., Ltd. All rights reserved.
     *
     */
    package com.java.offer;
    
    import com.java.offer.tree.TraversalOfBinaryTree;
    import com.java.offer.tree.TreeNode;
    
    /**
     * @since 2019年2月18日 下午7:07:37
     * @author xuchao
     *
     * 重建二叉树:
     * 前序+中序,后续+中序可以完成重建,而前序+后序无法完成
     */
    public class P7_ConstructBinaryTree {
    
        public static TreeNode<Integer> constructBinaryTree(int[] pre, int preStart, int preEnd, int[] in, int inStart, int inEnd) {
            if (preStart > preEnd || inStart > inEnd) {
                return null;
            }
            TreeNode<Integer> root = new TreeNode<Integer>(pre[preStart]);
            for (int i = inStart; i <= inEnd; i++) {
                if (in[i] == root.val) {
                    root.left = constructBinaryTree(pre, preStart + 1, preStart + i - inStart, in, inStart, i - 1);
                    root.right = constructBinaryTree(pre, preStart + i - inStart + 1, preEnd, in, i + 1, inEnd);
                }
            }
            return root;
        }
        
        public static void main(String[] args) {
            //        1
            //      /   
            //     2     3
            //   /   
            //  4     5
            // pre->12453 in->42513 post->45231
            int[] pre = { 1, 2, 4, 5, 3 };
            int[] in = { 4, 2, 5, 1, 3 };
            
            TreeNode<Integer> root = constructBinaryTree(pre, 0, pre.length - 1, in, 0, in.length - 1);
            // 对重建后的树,进行前中后序遍历,验证是否正确
            System.out.println(TraversalOfBinaryTree.preorderRecursively(root));
            System.out.println(TraversalOfBinaryTree.inorderRecursively(root));
            System.out.println(TraversalOfBinaryTree.postorderRecursively(root));
            System.out.println(TraversalOfBinaryTree.levelorder(root));
        }
    }
  • 相关阅读:
    【洛谷P5514】永夜的报应【模拟】
    当你闲得无聊去编 C++「贪吃蛇」小游戏
    【牛客练习赛50】C
    【JZOJ3410】Tree【最小生成树】
    @Zookeeper可视化工具。 ZK 安装 node-zk-browser。2015.10.22亲测可用
    Zookeeper可视化工具。 ZK 安装 node-zk-browser。2015.10.22亲测可用
    读 Paxos 到 ZooKeeper ¥ 50大洋
    ZooKeeper 分布式锁
    UML 绘图关系
    Astah 使用 流程图、类图、时序图
  • 原文地址:https://www.cnblogs.com/chao-zjj/p/10402306.html
Copyright © 2011-2022 走看看