• 二叉树的序列化和反序列化


    二叉树被记录成文件的过程叫做二叉树的序列号。通过文件内容重建原来二叉树的过程叫做二叉树的反序列号。

    给定一个二叉树头节点head,并已知二叉树节点值的类型为32位整型。设计一种二叉树序列化,和反序列化方案,并且代码实现。

    方法一,先序遍历下的序列化过程,首先假设徐立华的结果字符串为str,初始str=“”, 先序遍历二叉树,如果遇到null节点,就在str末尾加上“#”  节点不存在,“!”表示一个值的结束。如果遇到不为空的节点,假设节点值为3,就在str的末尾加上 3!。

    package TT;
    
    public class Test200 {
    
    	public class Node{
    		public int value;
    		public Node left;
    		public Node right;
    		
    		public Node(int data){
    			this.value=data;
    		}
    	}
    	
    	
      public String serialByPre(Node head){
    	  if(head==null){
    		  return "#!";
    	  }
    	  String res = head.value+"!";
    	  res += serialByPre(head.left);
    	  res += serialByPre(head.right);
    	  return res;
      }	
    }
    

      接下来,通过先序遍历序列化的结果字符串str,重构二叉树的过程,反序列化。

    方法二、通过层遍历实现序列化和反序列化

      初始时 str=“空”  然后实现二叉树的按层遍历,具体方式是利用队列结构,也就是宽度遍历图的常见方式。

    package TT;
    
    import java.util.LinkedList;
    import java.util.Queue;
    
    public class Test200 {
    
    	public class Node{
    		public int value;
    		public Node left;
    		public Node right;
    		
    		public Node(int data){
    			this.value=data;
    		}
    	}
    	
    public String serialBylevel(Node head){
    	if(head == null){
    		return "#!";
    	}
    	String res = head.value+"!";
    	Queue<Node> queue = new LinkedList<Node>();
    	queue.offer(head);
    	
    	while(!queue.isEmpty()){
    		head=queue.poll();
    		if(head.left != null){
    			res+=head.left.value+"!";
    			queue.offer(head.left);
    		}else {
    			res+="#!";
    		}
    		if(head.right != null){
    			res+=head.right.value+"!";
    			queue.offer(head.right);
    		}else {
    			res+="#!";
    		}
    		
    	}
    	return res;
    	
     }
     
    }
    

      

    先序遍历的反序列化其实就是重做先序遍历,遇到“#”就生成null节点,结束生成后续子树的过程

    package TT;
    
    import java.util.LinkedList;
    import java.util.Queue;
    
    public class Test200 {
    
    	public class Node{
    		public int value;
    		public Node left;
    		public Node right;
    		
    		public Node(int data){
    			this.value=data;
    		}
    	}
    	
    public String serialBylevel(Node head){
    	if(head == null){
    		return "#!";
    	}
    	String res = head.value+"!";
    	Queue<Node> queue = new LinkedList<Node>();
    	queue.offer(head);
    	
    	while(!queue.isEmpty()){
    		head=queue.poll();
    		if(head.left != null){
    			res+=head.left.value+"!";
    			queue.offer(head.left);
    		}else {
    			res+="#!";
    		}
    		if(head.right != null){
    			res+=head.right.value+"!";
    			queue.offer(head.right);
    		}else {
    			res+="#!";
    		}
    		
    	}
    	return res;
    	
     }
     
    
    
    public Node reconByLevelString(String levelStr){
    	
    	 String[] values  = levelStr.split("!");
    	 int index = 0;
    	 Node head = generateNodeByString(values[index++]);
    	 Queue<Node> queue = new LinkedList<Node>();
    	 if(head != null){
    		 queue.offer(head);
    	 }
    	Node node = null;
    	while(!queue.isEmpty()){
    		node = queue.poll();
    		node.left = generateNodeByString(values[index++]);
    		node.right = generateNodeByString(values[index++]);
    		if(node.left !=null){
    			queue.offer(node.left);
    		}
    		if(node.right != null){
    			queue.offer(node.right);
    		}
    	}
    	 return head;
    	
    }
    
    
    public Node generateNodeByString(String val){
    	if(val.equals("#")){
    		return null;
    	}
    	return new Node(Integer.valueOf(val));
    }
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    }
    

      

  • 相关阅读:
    关于SVM数学细节逻辑的个人理解(二):从基本形式转化为对偶问题
    关于SVM数学细节逻辑的个人理解(三) :SMO算法理解
    [2017BUAA软工]第0次个人作业
    关于SVM数学细节逻辑的个人理解(一) :得到最大间隔分类器的基本形式
    个人作业Week 1
    [2017BUAA软工]第一次个人项目 数独的生成与求解
    windows下安装webgoat
    .net 的StringComparison
    飞信登录过程的协议分析 (TCP直连方式)
    C#的String.Split方法
  • 原文地址:https://www.cnblogs.com/toov5/p/7541871.html
Copyright © 2020-2023  润新知