剑指offer系列35----序列化二叉树

【题目】

* 请实现两个函数,分别用来序列化和反序列化二叉树
* 1
/ \
2 3
/\ /\
4 5 6 7
*
* 序列化的结果是1,2,#,#,3,4,#,7,#,#,5,#,#,。
* 而反序列化的结果则是输出一棵二叉树。

 1 package com.exe7.offer;
 2
 3 /**
 4  * 请实现两个函数,分别用来序列化和反序列化二叉树
 5  * 1
 6   /  7  2    3
 8  /\    / 9 4  5   6  7
10  *
11  * 序列化的结果是1,2,#,#,3,4,#,7,#,#,5,#,#,。
12  * 而反序列化的结果则是输出一棵二叉树。
13  * @author WGS
14  *
15  */
16 public class SerializeBiTree {
17     static class TreeNode{
18         int val=0;
19         TreeNode left=null;
20         TreeNode right=null;
21         TreeNode next=null;
22         public TreeNode(int val){
23             this.val=val;
24         }
25     }
26
27     //序列化  前序
28     public String serialize(TreeNode pRoot){
29
30         StringBuilder sb=new StringBuilder();
31         if(pRoot==null){
32             sb.append("#,");
33             return sb.toString();
34         }
35         sb.append(pRoot.val+",");
36         sb.append(serialize(pRoot.left));
37         sb.append(serialize(pRoot.right));
38         return sb.toString();
39
40     }
41     //反序列化 相当于创建二叉树的过程
42     int p=-1;
43     public TreeNode deSerialize(String strIn){
44         p++;
45         if(p>strIn.length())
46             return null;
47         String[] strArr=strIn.split(",");
48         TreeNode node=null;
49         if(!strArr[p].equals("#")){
50             node=new TreeNode(Integer.valueOf(strArr[p]));
51             node.left=deSerialize(strIn);
52             node.right=deSerialize(strIn);
53         }
54         return node;
55
56     }
57     public void preOrder(TreeNode node){
58         if(node==null) return;
59         System.out.print(node.val+"  ");
60         preOrder(node.left);
61         preOrder(node.right);
62     }
63     public static void main(String[] args) {
64         SerializeBiTree s=new SerializeBiTree();
65
66         //反序列化
67         String strIn=("1,2,#,#,3,4,#,7,#,#,5,#,#,");
68         TreeNode tempNode=s.deSerialize(strIn);
69         s.preOrder(tempNode);//前序遍历
70
71         System.out.println("------------------------");
72         //序列化  结果: 1,2,4,#,#,5,#,#,3,6,#,#,7,#,#,
73 /*
74            1
75           / 76          2    3
77         /\    /78        4  5   6  7
79  * */
80         TreeNode root=new TreeNode(1);
81         TreeNode node1=new TreeNode(2);
82         TreeNode node2=new TreeNode(3);
83         TreeNode node3=new TreeNode(4);
84         TreeNode node4=new TreeNode(5);
85         TreeNode node5=new TreeNode(6);
86         TreeNode node6=new TreeNode(7);
87         root.left=node1;//2
88         root.right=node2;//3
89         node1.left=node3;//4
90         node1.right=node4;//5
91         node2.left=node5;//6
92         node2.right=node6;//7
93
94         String str=s.serialize(root);
95         System.out.println(str);
96     }
97
98 }
时间: 2024-10-27 12:36:35

剑指offer系列35----序列化二叉树的相关文章

剑指offer系列32-----对称二叉树的判断

[题目]请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. 1 package com.exe7.offer; 2 3 /** 4 * [题目]请实现一个函数,用来判断一颗二叉树是不是对称的. 5 * 注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. 6 * @author WGS 7 * 8 */ 9 public class SymmetricalTreeNode { 10 public class TreeNode{

《剑指offer》:[62]序列化二叉树

题目:请实现两个函数,分别来序列化和反序列化二叉树. 方案分析:我们知道通过二叉树的中序和任何一个前或者后续遍历都可以反序列化一棵二叉树,但是这样做有一个缺点就是,序列化的数据不能有重复的数据,否则会出错.另外,在反序列化时,需要知道中序和另外的任意一种序列才行,如果两课二叉树在字符流里读出,且二叉树的数据比较多,则会相当的耗时.所以,这里我们采取前序遍历来完成序列化和反序列化,因为我们都知道用前序遍历创建过二叉树.只不过这里如果一旦遇到NULL结点,我们需要用其他的字符来代替它.这样在反序列化

剑指offer系列源码-二叉树中和为某一值的路径

输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. #include <iostream> #include<stdio.h> #include<vector> using namespace std; struct BinaryTreeNode{ int value; BinaryTreeNode* left; BinaryTreeNode* right; }; //递归判断路劲

剑指offer系列源码-二叉树的镜像

输入一个二叉树,输出其镜像. 解法:交换所有非叶子结点的左右结点. #include<stdio.h> #include<iostream> using namespace std; struct BinaryTreeNode{ int value; BinaryTreeNode* left; BinaryTreeNode* right; }; //树的镜像 void reseverBinaryTree(BinaryTreeNode* root){ if(root==NULL||(

剑指offer系列——35.数组中的逆序对??

Q:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000000007 输入描述: 题目保证输入的数组中没有的相同的数字 数据范围: 对于%50的数据,size<=10^4 对于%75的数据,size<=10^5 对于%100的数据,size<=2*10^5 示例1 输入: 1,2,3,4,5,6,7,0 输出: 7 T:引用:https://blog.

剑指offer系列35:扑克牌顺子

把大小王当做0.然后对整个序列排序.排序后计算大小王的数目和需要大小王填的坑的数目.如果大小王数目大于等于要填的坑的数目就返回真,否则返回假. 1 class Solution { 2 public: 3 bool IsContinuous(vector<int> numbers) { 4 if (numbers.empty()) 5 return false; 6 sort(numbers.begin(), numbers.end()); 7 //count:需要填的坑的数目,king:大小

剑指Offer:对称的二叉树【28】

剑指Offer:对称的二叉树[28] 题目描述 请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. 题目分析 Java题解 /* public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ public class Solution {

剑指Offer系列之题11~题15

目录 11.矩形覆盖 12.二进制中1的个数 13. 数值的整数次方 14.调整数组顺序使奇数位于偶数前面 15.链表中倒数第k个结点 11.矩形覆盖 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 比如n=3时,2*3的矩形块有3种覆盖方法: 斐波那契数列的应用 第一次竖着放一块类比为走一步,第一次横着放两块类比为走两步 代码与上面的斐波那契数列类题目类似,此处不再赘述:剑指Offer系列之题6~题10. 12.

剑指offer系列47:堆成的二叉树

这个题的主要思路是: 用二叉树的左子树的右子树和右子树的左子树比较,再用左子树的左子树和右子树的右子树比较.(好像有点绕,但其实就是堆成的思想) 剑指offer的说法是用数的前序遍历的两个方法,前序遍历应该是:根->左->右.但是我们用另一种前序遍历:根->右->左.如果这两个序列一样就判断它是对称的. 这两个方法在实现上其实是一样的. 1 class Solution { 2 public: 3 bool isSymmetrical(TreeNode* pRoot) 4 { 5

【剑指offer】十七,二叉树中和为某一值的路径

题目描述 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. 分析:队树的节点值得求和之类的操作大部分都是基于树的遍历操作的,只要对树的遍历操作稍作变形,基本都能解决问题(个人观点).我们知道只有树的先序遍历是首先访问根节点的,此题的关键在于如何把树遍历过程中的节点保存下来,把满足条件的路径加入到结果中,不满足条件的路径节点如何进行重新的搜索.当用前序遍历的方式访问到某一节点时,我们把该节点添加到路径上,并