把序列化二叉树讲给女朋友听

序列化二叉树

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

首先按照题意,每一个节点后面都应该加一个"!",然后空节点使用"#"表示,这个是大前提;
其次,大体上的意思是先序遍历二叉树,得到遍历结果,然后根据遍历结果来生成树;
先序遍历肯定没什么问题,遇到空就加井号,遇到值就加值,不过记得加感叹号代表结束;
问题来了,之前都知道,只有先序遍历怎么可能得出唯一的树呢??但是此题不同,因为这道题把咱们的【空节点】都标出来了,所以能够得出唯一的树;
例如:图片说明 ,这个二叉树很简单吧,序列化之后呢:1!2!#!#!3!#!#!,如果要是不加空节点的标志,那就是123,就根据123,那反序列后的二叉树还可能是这样呢图片说明 ,但是有了空节点的标志,咱们就可以进行反序列化了;
要先根据"!"把字符串分为字符数组[1, 2, #, #, 3, #, #]
然后遍历此数组生成树,所以我们需要一个全局变量记录下标index;
算法流程:先判断是否是"#",是的话就返回null(返回null,就相当于返回到了上一个节点了)
然后以当前节点创建树节点,然后递归创建左树和右树
代码如下:

String seqTree = "";
    int index = 0;
    String Serialize(TreeNode root) {
        dfs(root);
        System.out.println("序列化之后的值为:"+seqTree);
        return seqTree;
    }
    void dfs(TreeNode root) {
        if (root == null) {
            seqTree += "#!";
            return;
        } else {
            seqTree += String.valueOf(root.val) + "!";
        }
        dfs(root.left);
        dfs(root.right);
    }
    TreeNode Deserialize(String str) {
       String[] nodes = str.split("!");
       return helpDeserialize(nodes);
    }
    TreeNode helpDeserialize(String[] str) {
        if ("#".equals(str[index])) {
            index++;
            return null;
        }
        TreeNode node = new TreeNode(Integer.valueOf(str[index++]));
        node.left = helpDeserialize(str);
        node.right = helpDeserialize(str);
        return node;
    }
全部评论

相关推荐

01-17 10:58
四川大学 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务