面试题37:序列化二叉树

/*

 * 面试题37:序列化二叉树

 * 题目:请实现两个函数,分别用来序列化和反序列化二叉树

 * 思路:序列化:前序遍历二叉树存入字符串中;反序列化:根据前序遍历重建二叉树

 * 根据前序遍历规则完成序列化与反序列化。

 * 所谓序列化指的是遍历二叉树为字符串;

 * 所谓反序列化指的是依据字符串重新构造成二叉树。   

 * 依据前序遍历序列来序列化二叉树,因为前序遍历序列是从根结点开始的。

 * 当在遍历二叉树时碰到Null指针时,这些Null指针被序列化为一个特殊的字符“#”  

 *  另外,结点之间的数值用逗号隔开。

 */

public class No37Serialize {

 

    public static void main(String[] args) {

       No37Serialize n = new No37Serialize();

      

       TreeNode10 root = new TreeNode10(1);

       TreeNode10 p2 = new TreeNode10(2);

       TreeNode10 p3 = new TreeNode10(3);

       TreeNode10 p4 = new TreeNode10(4);

       TreeNode10 p5 = new TreeNode10(5);

       TreeNode10 p6 = new TreeNode10(6);

      

       root.left = p2;

       root.right = p3;

       p2.left = p4;

       p3.left = p5;

       p3.right = p6;

       String str = n.Serialize(root);

       System.out.println(str);

       TreeNode10 node = n.Deserialize(str);

       System.out.print("后序遍历结果是: " );

       n.lastOrderTraverse(node);

      

    }

    //后续遍历输出二叉树

    private void lastOrderTraverse(TreeNode10 node) {

       if (node != null) {

           lastOrderTraverse(node.left);

           lastOrderTraverse(node.right);

           System.out.print( node.val);

       }

    }

    //序列化

    String Serialize(TreeNode10 root) {

       StringBuffer sb = new StringBuffer();

       if (root == null) {

           sb.append("#,");

           return sb.toString();

       }

      

       sb.append(root.val + ",");

       sb.append(Serialize(root.left));

       sb.append(Serialize(root.right));

      

       return sb.toString();

    }

    //反序列化

    int index = -1;

    TreeNode10 Deserialize(String str) {

       index++;

       int len = str.length();

       String[] strs = str.split(",");

      

       TreeNode10 node = null;

      

       if (index >= len) {

           return null;

       }

      

       if (!strs[index].equals("#")) {

           node = new TreeNode10(Integer.valueOf(strs[index]));

           node.left = Deserialize(str);

           node.right =Deserialize(str);

       }

       return node;

    }

 

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值