1. publicclassTest{
  2.  
  3.     publicstaticvoid main(String[] args){
  4.  
  5.         char[] ch =newchar[]{'A','B','D','#','#','G','#','#','C','J','#','#','M','#','#'};
  6.         BinaryTree binaryTree =newBinaryTree(ch);
  7.  
  8.         binaryTree.preOrder();
  9.         System.out.println();
  10.  
  11.         binaryTree.inOrder();
  12.         System.out.println();
  13.  
  14.         binaryTree.postOrder();
  15.         System.out.println();
  16.  
  17.         binaryTree.levelOrder();
  18.         System.out.println();
  19.  
  20.     }
  21.  
  22. }
 
 
  1. publicclassBinaryTree{
  2.  
  3.     //二叉树结点
  4.     publicclassBiNode{
  5.         char data;
  6.         BiNode left;
  7.         BiNode right;
  8.  
  9.         BiNode(char data,BiNode left,BiNode right){
  10.             this.data = data;
  11.             this.left = left;
  12.             this.right = right;
  13.         }
  14.  
  15.         int flag =0;//供非递归后序遍历使用
  16.     }
  17.  
  18.     //根结点
  19.     publicBiNode root;
  20.  
  21.     privatestaticint i;
  22.     publicBinaryTree(char[] pre){
  23.         i =0;
  24.         root = create(pre);
  25.     }
  26.  
  27.     //初始化(先序遍历顺序存放数组、'#'表示null)
  28.     privateBiNode create(char[] pre)
  29.     {
  30.         if(i < pre.length)
  31.         {
  32.             if(pre[i]=='#')                             //结点为空
  33.             {
  34.                 i++;
  35.                 return null;
  36.             }
  37.  
  38.             BiNode p =newBiNode(pre[i], null, null);    //结点非空
  39.             i++;
  40.             p.left = create(pre);                         //递归建立左子树
  41.             p.right = create(pre);                       //递归建立右子树
  42.             return p;
  43.         }
  44.         return null;
  45.     }
  46.  
  47.     //先序遍历
  48.     publicvoid preOrder(){
  49.         System.out.print("preOrder traversal with recursion:");
  50.         preOrder(root);
  51.         System.out.println();
  52.  
  53.         System.out.print("preOrder traversal without recursion:");
  54.         preOrder2(root);
  55.         System.out.println();
  56.     }
  57.     //递归
  58.     privatevoid preOrder(BiNode root){
  59.         if(root == null)return;
  60.  
  61.         System.out.print(root.data);       //访问结点
  62.         preOrder(root.left);
  63.         preOrder(root.right);
  64.     }
  65.     //非递归
  66.     privatevoid preOrder2(BiNode head){
  67.         LinkedList<BiNode> s =newLinkedList<BiNode>();
  68.  
  69.         while(head != null ||!s.isEmpty())
  70.         {
  71.             while(head != null)                //访问左子树
  72.             {
  73.                 System.out.print(head.data);    //访问左子树
  74.                 s.push(head);                    //结点入栈(待后面找其右子树使用)= =(“递归”)
  75.                 head = head.left;
  76.             }
  77.  
  78.             if(!s.isEmpty())                   //转向右子树
  79.             {
  80.                 head = s.peek().right;     //转向右子树
  81.                 s.pop();                        //结点出栈(已经找到其右子树)= =(“递归结束”)
  82.             }
  83.         }
  84.     }
  85.  
  86.     //中序遍历
  87.     publicvoid inOrder(){
  88.         System.out.print("inOrder traversal with recursion:");
  89.         inOrder(root);
  90.         System.out.println();
  91.  
  92.         System.out.print("inOrder traversal without recursion:");
  93.         inOrder2(root);
  94.         System.out.println();
  95.     }
  96.     //递归
  97.     privatevoid inOrder(BiNode root){
  98.         if(root == null)return;
  99.  
  100.         inOrder(root.left);
  101.         System.out.print(root.data);      //访问结点
  102.         inOrder(root.right);
  103.     }
  104.     //非递归
  105.     privatevoid inOrder2(BiNode head){
  106.         LinkedList<BiNode> s =newLinkedList<BiNode>();
  107.  
  108.         while(head != null ||!s.isEmpty())
  109.         {
  110.             while(head != null)                //左子树入栈
  111.             {
  112.                 s.push(head);                    //结点入栈(待后面找其右子树使用)= =(“递归”)
  113.                 head = head.left;
  114.             }
  115.  
  116.             System.out.print(s.peek().data);    //访问左子树
  117.  
  118.             if(!s.isEmpty())                   //转向右子树
  119.             {
  120.                 head = s.peek().right;         //转向右子树
  121.                 s.pop();                        //结点出栈(已经找到其右子树)= =(“递归结束”)
  122.             }
  123.         }
  124.     }
  125.  
  126.     //后序遍历
  127.     publicvoid postOrder(){
  128.         System.out.print("postOrder traversal with recursion:");
  129.         postOrder(root);
  130.         System.out.println();
  131.  
  132.         System.out.print("postOrder traversal without recursion:");
  133.         postOrder2(root);
  134.         System.out.println();
  135.     }
  136.     //递归
  137.     privatevoid postOrder(BiNode root){
  138.         if(root == null)return;
  139.  
  140.         postOrder(root.left);
  141.         postOrder(root.right);
  142.         System.out.print(root.data);     //访问结点
  143.     }
  144.     //非递归
  145.     //后序遍历特点:递归左右子树后,还需访问结点:
  146.     //1、左子树入栈
  147.     //2、“两次出栈”(用flag标记模仿):第一次是为了找到左子树相应的右子树结点;第二次是为了访问结点
  148.     privatevoid postOrder2(BiNode head){
  149.         LinkedList<BiNode> s =newLinkedList<BiNode>();
  150.  
  151.         while(head != null ||!s.isEmpty())
  152.         {
  153.             while(head != null)                        //左子树入栈
  154.             {
  155.                 head.flag =1;
  156.                 s.push(head);                            //结点连同flag入栈(待后面找其右子树使用)= =(“递归”)
  157.                 head = head.left;
  158.             }
  159.  
  160.             while(!s.isEmpty()&& s.peek().flag ==2)  //若flag为2(已经找到其右子树出过一次栈),访问结点
  161.             {
  162.                 System.out.print(s.peek().data);       //访问结点元素
  163.                 s.pop();                                //(第二次“结点出栈”)实际结点出栈(已经访问结点元素)= =(“递归结束”)
  164.             }
  165.  
  166.             if(!s.isEmpty())                          //flag为1,转向右子树
  167.             {
  168.                 head = s.peek().right;                //转向右子树
  169.                 s.peek().flag =2;                    //(第一次“flag模拟出栈”)标记为2,但实际结点不出栈(已经找到其右子树)
  170.             }
  171.  
  172.  
  173.         }
  174.     }
  175.  
  176.     //层序遍历
  177.     publicvoid levelOrder(){
  178.         levelOrder(root);
  179.     }
  180.     privatevoid levelOrder(BiNode root){
  181.         LinkedList<BiNode>queue=newLinkedList<BiNode>();  //LinkedList实现了Queue接口
  182.  
  183.         BiNode p = root;
  184.         while(p != null){
  185.             System.out.print(p.data);    //访问结点
  186.  
  187.             if(p.left != null)
  188.                 queue.add(p.left);
  189.             if(p.right != null)
  190.                 queue.add(p.right);
  191.  
  192.             p =queue.poll();           //队头出队并返回为p
  193.         }
  194.     }
  195.  
  196.     //在p结点后插入data
  197.     publicvoid insert(BiNode p,char data, boolean left){
  198.         if(p != null){
  199.             if(left)                //插入位置为左孩子
  200.                 p.left =newBiNode(data,p.left,null);
  201.             else                   //插入位置为右孩子
  202.                 p.right =newBiNode(data,p.right,null);
  203.         }
  204.     }
  205.  
  206.     //删除p的一个子树
  207.     publicvoiddelete(BiNode p, boolean left){
  208.         if(p != null){
  209.             if(left)              //删除目标为左子树
  210.                 p.left = null;
  211.             else                  //删除目标为右子树
  212.                 p.right = null;
  213.         }
  214.     }
  215.  
  216. }
 
 
 
 
 

二叉树(二叉链表实现)JAVA代码的更多相关文章

  1. C#实现二叉树--二叉链表结构

    二叉树的简单介绍 关于二叉树的介绍请看这里 : 二叉树的简单介绍 http://www.cnblogs.com/JiYF/p/7048785.html 二叉链表存储结构: 二叉树的链式存储结构是指,用 ...

  2. C语言递归实现二叉树(二叉链表)的三种遍历和销毁操作(实验)

    今天写的是二叉树操作的实验,这个实验有三个部分: ①建立二叉树,采用二叉链表结构 ②先序.中序.后续遍历二叉树,输出节点值 ③销毁二叉树 二叉树的节点结构定义 typedef struct BiTNo ...

  3. 二叉树的二叉链表存储结构及C++实现

    前言:存储二叉树的关键是如何表示结点之间的逻辑关系,也就是双亲和孩子之间的关系.在具体应用中,可能要求从任一结点能直接访问到它的孩子. 一.二叉链表 二叉树一般多采用二叉链表(binary linke ...

  4. c使用二叉链表创建二叉树遇到的一些疑问和思考

    二叉链表存储二叉树 学习的时候参考的是<大话数据结构>,书中是这样定义的 typedef char TElemType; typedef struct BiTNode { TElemTyp ...

  5. 树(二叉树 & 二叉搜索树 & 哈夫曼树 & 字典树)

    树:n(n>=0)个节点的有限集.有且只有一个root,子树的个数没有限制但互不相交.结点拥有的子树个数就是该结点的度(Degree).度为0的是叶结点,除根结点和叶结点,其他的是内部结点.结点 ...

  6. 编程算法 - 二叉搜索树 与 双向链表 代码(C++)

    二叉搜索树 与 双向链表 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 题目:输入一颗二叉搜索树, 将该二叉搜索树转换成一个排序的双向链表. 要求 ...

  7. 【算法与数据结构】二叉搜索树的Java实现

    为了更加深入了解二叉搜索树,博主自己用Java写了个二叉搜索树,有兴趣的同学可以一起探讨探讨. 首先,二叉搜索树是啥?它有什么用呢? 二叉搜索树, 也称二叉排序树,它的每个节点的数据结构为1个父节点指 ...

  8. 二叉搜索树 思想 JAVA实现

    二叉搜索树:一棵二叉搜索树是以一棵二叉树来组织的,这样一棵树可以使用链表的数据结构来表示(也可以采用数组来实现).除了key和可能带有的其他数据外,每个节点还包含Left,Right,Parent,它 ...

  9. 二叉搜索树及java实现

    二叉搜索树(Binary Search Tree) 二叉搜索树是二叉树的一种,是应用非常广泛的一种二叉树,英文简称为 BST 又被称为:二叉查找树.二叉排序树 任意一个节点的值都大于其左子树所有节 ...

  10. 二叉搜索树的java实现

    转载请注明出处 一.概念 二叉搜索树也成二叉排序树,它有这么一个特点,某个节点,若其有两个子节点,则一定满足,左子节点值一定小于该节点值,右子节点值一定大于该节点值,对于非基本类型的比较,可以实现Co ...

随机推荐

  1. JavaScript--格式化当前时间

    <!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...

  2. Linux服务器指令

    1.查看cpu信息:/proc/cpuinfo2.查看内存信息:/prco/meminfo3.查看服务器版本信息:cat /etc/issue4.服务器系统位数:uname -a5.网卡信息:ifco ...

  3. javascript之attribute 和 property

    首先看看这两个单词的英文释义(来自有道词典).先是property: property ['prɔpəti] n. 性质,性能:财产:所有权 英英释义: any area set aside for ...

  4. Git对于单个文件的分批提交方式的使用

    很多时候,对于一个大的文件,可能有的同学改完之后不想一次提交,想分批提交.但这个时候由于git add的机制往往add之后就是整个一个文件被放到stage区了,这个时候肯定会想能不能对一个文件可以进行 ...

  5. mysql 数据库查询与实例。

    资料是从教材弄下来的,加上了我的理解.主要内容是练习实例,在写博文中学习命令行,当然也希望这篇博文能帮助其他人学习mysq数据库命令 SELECT 语句可以从一个或多个表中选取特定的行和列 SELEC ...

  6. getUrlParam,jQuery中的URL参数获取

    大家经常会需要在一段URL中截取到自己所需参数的值,下面的方法也许能帮到您: $.getUrlParam = function(name){ var reg = new RegExp("(^ ...

  7. Win7 64位 php-5.5.13+Apache 2.4.9+mysql-5.6.19 配置

    一 :准备阶段 1:php php-5.5.13下载链接:http://windows.php.net/downloads/releases/php-5.5.13-Win32-VC11-x64.zip ...

  8. weekly review

    鉴于某位昔日工作在我身边的大师一直在写review,所以为了能靠近大师,我也要开始写review了. 无名师曾经说过,想要成为大师的话,要先找到一个大师,然后追随大师,再然后与大师通行,之后成为大师, ...

  9. 12100 Printer Queue(优先队列)

    12100 Printer Queue12 The only printer in the computer science students’ union is experiencing an ex ...

  10. 仿微博——MJExtension之字典转模型

    1.模型类中定义好属性 2.用AFN请求下来的数据保存到字典中 3.从字典中取出微博字典数组 //微博字典数组 NSArray *restrictArray = responseObject[@&qu ...