题目描述
请实现两个函数,分别用来序列化和反序列化二叉树
二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(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; } }