二叉树重构和序列化反序列化

二叉树重构条件:

    各个节点的value值保证唯一(这个很重要,不唯一无法重构),同时已知先序遍历结果和中序遍历结果或者是已知后序遍历结果和中序遍历结果。

二叉数重构代码:

public TreeNode getTree(String[] In,String[] Pos){
        //In和Pos长度相同
        if(In.length == 0){
            return null;
        }
        int rootValue  = Integer.parseInt(Pos[Pos.length - 1]);
        TreeNode root = new TreeNode(rootValue);
        if(In.length == 1){
            return root;
        }
        int delimiterIndex;
        for(delimiterIndex = 0; delimiterIndex < In.length; delimiterIndex++){
            if(Integer.parseInt(In[delimiterIndex]) == rootValue){
                break;
            }
        }
        String[] leftIn = Arrays.copyOfRange(In,0,delimiterIndex);
        String[] rightIn = Arrays.copyOfRange(In,delimiterIndex+1,In.length);
        String[] leftPos = Arrays.copyOfRange(Pos,0,leftIn.length);
        String[] rightPos = Arrays.copyOfRange(Pos,leftIn.length,Pos.length - 1);
        root.left = getTree(leftIn,leftPos);
        root.right = getTree(rightIn,rightPos);
        return root;
    }

二叉树的序列化和反序列化中:

注意点:value值可以重复出现,这时不能用重构的方法来反序列化。树结构可能不一致。

二叉树序列化代码和反序列化代码:

StringBuilder tmp;
    // Encodes a tree to a single string.
    public String serialize(TreeNode root) {
        if(root == null){
            return null;
        }
        tmp = new StringBuilder();
        getMid(root);
        return tmp.toString();
    }
    public void getMid(TreeNode root){
        if(root == null){
            tmp.append("null").append(",");
            return ;
        };
        tmp.append(root.val).append(",");
        getMid(root.left);
        getMid(root.right);
    }
    // Decodes your encoded data to tree.
    public TreeNode deserialize(String data) {
        if(data  == null || data.length() == 0) return null;
        String[] In = data.split(",");
        LinkedList<String> strings = new LinkedList<String>(Arrays.asList(In));
        return getTree(strings);
    }
    public TreeNode getTree(LinkedList<String> In){
        if(In.get(0).equals("null")){
            In.remove(0);
            return null;    
        }
        TreeNode node = new TreeNode(Integer.parseInt(In.get(0)));
        In.remove(0);
        node.left = getTree(In);
        node.right = getTree(In);
        return node;
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值