题解 | #序列化二叉树#

序列化二叉树

http://www.nowcoder.com/practice/cf7e25aa97c04cc1a68c8f040e71fb84

  • 运行时间:14ms,超过99.75%的代码
  • 上图:

图片说明

解题思路:BSF,利用层序遍历进行序列化。

show you the code: 包括测试代码

   import java.util.LinkedList;

public class SerializeTreeTest {
    /**
     * 设置空节点的数值
     */
    static int NULL_NODE = -10086;
    /**
     * 空节点的字符串值
     */
    static String NULL_NODE_STR = "-10086";

    /**
     * 层序遍历列化二叉树
     * 等价于 BFS 遍历二叉树
     * 核心思路:利用队列
     * @param root 根节点
     * @return 以 | 分割的 BFS 结果
     */
    String Serialize(TreeNode root) {
        LinkedList<TreeNode> queue = new LinkedList<>();
        StringBuffer sb = new StringBuffer();
        queue.offer(root);
        while (!queue.isEmpty()) {
            TreeNode curNode = queue.remove(0);
            if (null == curNode) {
                sb.append(NULL_NODE).append('|');
            } else {
                sb.append(curNode.val).append('|');
                queue.offer(curNode.left);
                queue.offer(curNode.right);
            }
        }
        return sb.toString();
    }
    TreeNode Deserialize(String str) {
        // 1|获取字符串数组
        String[] nodeStrList = str.split("\\|");
        // 2|创建所有的节点
        TreeNode[] nodeArray = createNodeArray(nodeStrList);
        // 3|增加节点之间的父子关系
        addRelation(nodeArray);
        // 4|返回根节点
        return nodeArray[0];
    }

    /**
     * 给树数组增加父子关系
     * @param nodeArray
     */
    private void addRelation(TreeNode[] nodeArray) {
        // 两个指针,m指向父节点,n指向两个子节点:起始位置是m指向父节点,n指向左孩子节点
        int m = 0, n = 1;
        while (m < nodeArray.length) {
            // 当父节点为空时,跳过该节点,继续下一个父节点
            if (null == nodeArray[m]) {
                m++;
                continue;
            }
            // 给父节点的左孩子节点赋值
            nodeArray[m].left = n < nodeArray.length ? nodeArray[n] : null;
            // 给父节点的右孩子节点赋值
            nodeArray[m].right = n + 1 < nodeArray.length ? nodeArray[n + 1] : null;
            // 父节点的指针移动
            m ++;
            // 子节点的指针移动
            n +=2;
        }
    }

    /**
     * 根据字符串数组创建没有父子关系的树节点数组
     * @param nodeStrList
     * @return
     */
    private TreeNode[] createNodeArray(String[] nodeStrList) {
        // 判断根节点是否为空
        if (NULL_NODE_STR.equals(nodeStrList[0])) {
            // 只有根节点,且根节点为空
            return new TreeNode[1];
        }
        TreeNode[] nodeList = new TreeNode[nodeStrList.length];
        for (int i = 0; i < nodeStrList.length; i++) {
            nodeList[i] = getTreeNode(nodeStrList[i]);
        }
        return nodeList;
    }

    /**
     * 根据字符串的值获取节点
     * @param value 节点的字符串值,节点的值为"-10086"表示空节点
     * @return 节点
     */
    TreeNode getTreeNode(String value) {
        if (NULL_NODE_STR.equals(value)) {
            return null;
        } else {
            return new TreeNode(Integer.parseInt(value));
        }
    }

public static void main(String[] args) {
        /**
         *     8
         *    / \
         *   6   10
         *  / \  /\
         * 5  7 9 11
         * 8|6|10|5|7|9|11|#|#|#|#|
         */
        TreeNode one = new TreeNode(8);
        TreeNode two = new TreeNode(6);
        TreeNode three = new TreeNode(10);
        TreeNode four = new TreeNode(5);
        TreeNode five = new TreeNode(7);
        TreeNode six = new TreeNode(9);
        TreeNode seven = new TreeNode(11);

        one.left = two;
        one.right = three;
        two.left = four;
        two.right = five;
        three.left = six;
        three.right = seven;
        SerializeTreeTest serializeTreeTest = new SerializeTreeTest();
        String serialize = serializeTreeTest.Serialize(one);
        TreeNode deserializeTree = serializeTreeTest.Deserialize(serialize);
        /**
         *     5
         *   4  #
         *  3
         * # 2
         */
        TreeNode anOther = serializeTreeTest.Deserialize("5|4|-10086|3|-10086|-10086|2|-10086|-10086|");
        System.out.println("----------------------");
    }
}
全部评论

相关推荐

昨天 22:05
已编辑
门头沟学院 Web前端
我是2月23号开始投简历的,投出去基本没回应,到现在只有3场面试,之前已经错过了秋招,所以想争取春招冲一冲;我想请牛友们,各位佬,看看我的简历,春招可以冲中小厂吗?2月底投出去的简历基本直接被拒,惨~目前我的进度是八股文看了很多,刷了30+算法题(弱爆啦),场景题基本没碰可能会G,常见手撕题敲了一遍(记不住,大概率G);项目很可能经不住深度拷打,还在加强学习。如果屏幕前的牛友们愿意给出建议,请畅所欲言,我一定认真阅读。毕设也欢迎各位佬直接开喷,链接:https://github.com/bignosecss/reverse-roadmap---一周过去了,更新下这周的春招的投递情况吧。这周总共约了4场面试,都是小公司;面试八股很少,没有手撕和算法,问场景和项目里的细节比较多。一家面了之后没消息了,一家二面挂,另外两家面试体验非常棒,面试官还会解答没答上的问题,总体来说反馈比2月份多不少,要简历的也多了。在招聘网站上投了很多,大多未读和已读不回,或者要了简历不回复的。邮箱、官网的投递基本没有声响,大海里扔石头,没声儿。。。感觉今年春招真的很难了,投出去没有水花,有力气没处使;不管是小厂中厂,投出去大多没回应,倒是很多外包找。不知道大问题在哪,感觉简历写的也差不多,不知道怎么继续优化了。总之每天保持学习节奏,不停的投,坚持到春招结束,相信会有机会的!
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务