62 序列化和反序列化 (反序列化的字符串构造一个二叉树——传入一个null节点 _层次遍历)

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

import java.util.*;
public class Solution {
    StringBuilder str = new StringBuilder("");
    String Serialize(TreeNode root) {        
        if(root == null)
            str.append("#!");
        else{//别掉了这个
            str.append(root.val + "!");
            Serialize(root.left);
            Serialize(root.right);
        }        
        return str.toString();
  }
    TreeNode Deserialize(String str) {      
        String s = "";
        String[] arr = str.split("!");        
        return createTree(null,arr);                
  }
    int index = 0;
    public TreeNode createTree(TreeNode node,String[] arr){
        String data = arr[index++];
        if("#".equals(data)){
            node = null;
        }else{
            Integer val = Integer.valueOf(data);
            node = new TreeNode(val);
            node.left = createTree(node.left,arr);
            node.right = createTree(node.right,arr);
        }                                       
       return node;
    }    

}

null也要加上一个“!”符号.为了后面容易使用split()函数。
注:传入了一个重要的参数值—null。若为null创建一个值,返回,由于是前序遍历,所以返回这个根节点就好,若不是null的话,创建它的左右节点,并将其赋值给左右节点。

在if下没有返回值的时候,不要轻易接着写,应该多考虑使用else

层次遍历:

 static TreeNode buildTree(ArrayList arr){
        int index = 0;
        TreeNode root = new TreeNode((int)arr.get(index++));
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while(!queue.isEmpty()){
            TreeNode tmp = queue.poll();
            Object o = arr.get(index++);
            if(o.equals("null")){
                tmp.left = null;
            }else
                tmp.left = new TreeNode((int)o);
            o = arr.get(index++);
            if("null".equals(o)){
                tmp.right = null;
            }else
                tmp.right = new TreeNode((int)o);
            if(tmp.left != null)
                queue.offer(tmp.left);
            if(tmp.right != null)
                queue.offer(tmp.right);
        }
      return root;
    }

    static ArrayList order(TreeNode root){
        ArrayList arr = new ArrayList();
        Queue<TreeNode> queue = new LinkedList<>();
        arr.add(root.val);//注意arr添加的位置
        queue.offer(root);
        while(!queue.isEmpty()){
            TreeNode tmp = queue.poll();
//不是在这里
            if(tmp.left != null){
                arr.add(tmp.left.val);
                queue.offer(tmp.left);
            }else
                arr.add("null");//因为需要添加"null"字符串
            if(tmp.right != null){
                arr.add(tmp.right.val);
                queue.offer(tmp.right);
            }else
                arr.add("null");
        }
        return arr;
    }

    public static void main(String[] args) {
        ArrayList arr = new ArrayList();
        arr.add(10);        arr.add(5);        arr.add(-3);
        arr.add(3);        arr.add(2);        arr.add("null");
        arr.add(11);        arr.add(3);        arr.add(-2);
        arr.add("null");    arr.add(1); arr.add("null");arr.add("null");
        arr.add("null");arr.add("null"); arr.add("null");arr.add("null"); arr.add("null");arr.add("null");
        TreeNode root = buildTree(arr);

        arr = order(root);
        System.out.println(arr);
    }

所以,知道,层次遍历既可以在入队前也可以在入队后收集非null的数据,如果要收集null的数据,那么必须在入队之前,因为null数据是不会入队的。

猜你喜欢

转载自blog.csdn.net/xuchonghao/article/details/80525809
今日推荐