题目描述
请实现两个函数,分别用来序列化和反序列化二叉树
二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。
二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。
例如,我们可以把一个只有根节点为1的二叉树序列化为"1,",然后通过自己的函数来解析回这个二叉树

/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;
    }
}
*/
public class Solution {
    String Serialize(TreeNode root) {
        if(root==null)
            return "#!";
        StringBuilder sb=new StringBuilder();
        Serialize2(root,sb);
        return sb.toString();   
  }
    void Serialize2(TreeNode root,StringBuilder sb){
        if(root==null)
        {
            sb.append("#!");
            return;
        }
        sb.append(root.val);
        sb.append("!");
        Serialize2(root.left,sb);
        Serialize2(root.right,sb);
    }
    TreeNode Deserialize(String str) {
        if(str.equals("#!"))
            return null;
        String[] strs=str.split("!");
        return Deserialize2(strs);
  }
    int index=-1;
    TreeNode Deserialize2(String[] strs){
        index++;
        if(!strs[index].equals("#"))
        {
            TreeNode root=new TreeNode(0);
            root.val=Integer.parseInt(strs[index]);
            root.left=Deserialize2(strs);
            root.right=Deserialize2(strs);
            return root;
        }
        return null;  
    }
}

题目描述
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。

/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }
}
*/
import java.util.ArrayList;
import java.util.Queue;
import java.util.LinkedList;
public class Solution {
    ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        ArrayList<ArrayList<Integer>> as=new ArrayList<>();
        Queue<TreeNode> q=new LinkedList();

        if(pRoot==null)
            return as;
        q.add(pRoot);
        while(q.size()>0)
        {
            ArrayList<Integer> a=new ArrayList<>();
            int n=q.size();
            for(int i=0;i<n;i++)
            {
                TreeNode t=q.poll();
                a.add(t.val);
                if(t.left!=null)
                    q.add(t.left);
                if(t.right!=null)
                    q.add(t.right);
            }
            as.add(new ArrayList(a));
        }
        return as;
    } 
}

题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
import java.util.Arrays;
public class Solution {
    public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
        if(pre.length<=0)
            return null;
        if(pre.length==1)
            return new TreeNode(pre[0]);
        int rootval=pre[0];
        TreeNode root=new TreeNode(rootval);
        int rootindex=0;
        for(int i=0;i<in.length;i++)
        {
            if(in[i]==rootval)
            {
                rootindex=i;
                break;
            }
        }      
        root.left=reConstructBinaryTree(Arrays.copyOfRange(pre,1,rootindex+1),Arrays.copyOfRange(in,0,rootindex));
        root.right=reConstructBinaryTree(Arrays.copyOfRange(pre,rootindex+1,pre.length),Arrays.copyOfRange(in,rootindex+1,in.length));
        return root;
    }
}