首页 > 编程语言 >剑指Offer-Java-序列化二叉树

剑指Offer-Java-序列化二叉树

时间:2022-12-14 15:01:31浏览次数:37  
标签:index right TreeNode string return 二叉树 Java 序列化 root


题目

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

代码

此题的核心点是如何表示二叉树,并且解释。

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

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

}

}
*/
import java.util.*;
public class Solution {
String Serialize(TreeNode root) {
StringBuilder string = new StringBuilder();
S(root,string);
return string.toString();
}
void S(TreeNode root,StringBuilder string){
//当没有子节点的时候加上#!
if(root==null){
string.append("#!");
return;
}
//在每个数据后面都加上!
//所以当整个字符串用!分割以后 无节点的时候为#,有节点的时候为其数据
string.append(root.val+"!");
S(root.left,string);
S(root.right,string);
}
TreeNode Deserialize(String str) {
String[] string = str.split("!");
TreeNode root = D(string);
return root;
}
int index = 0;
TreeNode D(String[] string){
//当为#的时候说明没有,index后移 并且返回null
if(string[index].equals("#")){
index++;
return null;
}else{
//当有节点的时候先构造节点,再对其左子树和右子树进行构造,次数的left和right不能互换方向,因为在序列化的时候的顺序是先序及先root再left,right。所以其顺序不可变
TreeNode temp = new TreeNode(Integer.parseInt(string[index]));
index++;
temp.left=D(string);
temp.right=D(string);
return temp;
}

}
}

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

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

}

}
*/
import java.util.*;
public class Solution {
String Serialize(TreeNode root) {
StringBuilder string = new StringBuilder();
S(root,string);
return string.toString();
}
void S(TreeNode root,StringBuilder string){
//当没有子节点的时候加上#!
if(root==null){
string.append("#!");
return;
}
//在每个数据后面都加上!
//所以当整个字符串用!分割以后 无节点的时候为#,有节点的时候为其数据
string.append(root.val+"!");
S(root.left,string);
S(root.right,string);
}
TreeNode Deserialize(String str) {
String[] string = str.split("!");
TreeNode root = D(string);
return root;
}
int index = 0;
TreeNode D(String[] string){
//当为#的时候说明没有,index后移 并且返回null
if(string[index].equals("#")){
index++;
return null;
}else{
//当有节点的时候先构造节点,再对其左子树和右子树进行构造,次数的left和right不能互换方向,因为在序列化的时候的顺序是先序及先root再left,right。所以其顺序不可变
TreeNode temp = new TreeNode(Integer.parseInt(string[index]));
index++;
temp.left=D(string);
temp.right=D(string);
return temp;
}

}
}


标签:index,right,TreeNode,string,return,二叉树,Java,序列化,root
From: https://blog.51cto.com/u_12938555/5936999

相关文章

  • Java做UI自动化和app自动化中动态代理@FindBy的工作原理【杭州多测师_王sir】【杭州多
    Java做UI自动化和app自动化中动态代理@FindBy的工作原理一、背景简介由于Selenium框架采用PageObject设计模式让测试代码与被测页面对象代码分离,因而提供了不少很方便的注......
  • 【都 Java19 了,还不了解 Java 8 ? 】一文带你深入了解 Java 8 新特性
    Java8(又称为jdk1.8)是Java语言开发的一个主要版本。Oracle公司于2014年3月18日发布Java8,它支持函数式编程,新的JavaScript引擎,新的日期API,新的Stream......
  • JAVA-枚举使用
    枚举在本教程中,我们将了解什么是Java枚举、它们解决的问题以及它们的一些设计模式如何在实践中使用。1.概述Java5首先引入了enum关键字。它表示一种特殊类型的类,它总......
  • 巨蟒python全栈开发数据库前端5:JavaScript1
     1.js介绍&变量&基础数据类型2.类型查询&运算符&if判断&for循环3.while循环&三元运算符4.函数5.今日总结 1.js介绍&变量&基础数据类型js介绍(1)什么是JavaScript&一些历史......
  • 94. 二叉树的中序遍历
    给定一个二叉树的根节点root,返回它的中序遍历。示例1:输入:root=[1,null,2,3]输出:[1,3,2]点击查看代码definorderTraversal(self,root):res......
  • Java8新特性
    一、Java8新特性1.Lambda表达式Lambda是匿名函数,使用它可以写出简洁,灵活的代码。  a.表达式无参数,无返回值,只有一个Lambda体Runnable r1=()->log.info......
  • Java面向对象2
    封装性    封装就是保护内容,保证某些属性或方法可以不被外部看见,而在内部自己去处理。 classPerson{Stringname;intage;publicvoidtell(){System.out......
  • Java面向对象1
     程序的发展阶段程序的发展经历了两个主要阶段:面向过程、面向对象。对于面向对象与面向过程可以用一个例子解释,如一个木匠要做一个盒子,那么做这个盒子的出发点会有两种......
  • 对象的序列化和反序列化
    读写JSON格式的数据通过上面的讲解,我们已经知道如何将文本数据和二进制数据保存到文件中,那么这里还有一个问题,如果希望把一个列表或者一个字典中的数据保存到文件中又该怎......
  • 50个Java面试必问的面试题,我都给你整好了
    ​我们整理了一份主要的Angular面试问题清单,分为三部分:角度面试问题–初学者水平角度面试问题–中级角度面试问题–高级初学者水平–面试问题1.区分Angular和Angula......