剑指offer第二版面试题37:序列化二叉树(java)

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

分析:
如图:
这里写图片描述

题目实际上就是用序列来表示一棵二叉树,然后还可以根据这个序列重建二叉树。对于上图中的树,以前序遍历为例,先访问到1,然后2,然后4,4的左右子结点都为空,可以用一个特殊字符$替代,所以上图中的二叉树前序遍历表示就是“1,2,4,$,$,$,3,5,$,$,6,$,$”。
重建的时候,访问的第一个结点为根结点,接下来的数字是2,它是根结点的左子结点。接下来的是4,它是2的左子结点。然后遇到两个$,说明4的左右子结点都是NULL。接下来结点回退,访问4的父结点2,又是$,说明2的右子结点是NULL。再返回到根结点,这时候该建立它的右子结点了,下一个数值是3,说明3是根结点的右子结点,剩下的步骤和左子树部分类似。

代码如下:

/**
 * 序列化二叉树和反序列化
 *      前提:
 *          节点都是0-9之间的数字,且不重复
 */

public class BinaryTreeSerialize {
    //序列化
    public void serialize(BinaryTreeNode root,StringBuffer sb){
        if(root == null)
            sb.append("$");
        else{
            sb.append(root.value);
            serialize(root.left,sb);
            serialize(root.right,sb);
        }
    }

    //反序列化
    public void deserialize(BinaryTreeNode root,StringBuffer sb){
        StringBuffer temp =  sb.deleteCharAt(0);
        if(temp != null && temp != new StringBuffer('$')){
            root = new BinaryTreeNode(temp.toString().charAt(0));
            deserialize(root.left, sb);
            deserialize(root.right, sb);
        }
    }
}

class BinaryTreeNode {
    char value;
    BinaryTreeNode left;
    BinaryTreeNode right;

    public BinaryTreeNode(char value) {
        this.value = value;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值