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. 重新开始学习javase_多态(动态绑定、推迟绑定或者运行期绑定)

    一,谈向上转换,或者上溯造型 什么是向上转换(上溯造型),一句话就是父类的引用指向子类的对象.或者把子类的对象当作父类来用 为什么要进行向上转换?我们先看一个例子吧! @Test public voi ...

  2. 二十分钟弄懂C++11 的 rvalue reference (C++ 性能剖析 (5))

    C++ 11加了许多新的功能.其中对C++性能和我们设计class的constructor或assignment可能产生重大影响的非rvalue reference莫属!我看了不少资料,能说清它的不多 ...

  3. 初涉JavaScript模式 (11) : 模块模式

    引子 这篇算是对第9篇中内容的发散和补充,当时我只是把模块模式中的一些内容简单的归为函数篇中去,在北川的提醒下,我才发觉这是非常不严谨的,于是我把这些内容拎出来,这就是这篇的由来. 什么是模块模式 在 ...

  4. ecshop json类的使用

    ecshop中有2个地方使用了json,一个是cls_json.php文件,一个是transport.js文件. cls_json 封装了json类,可以调用里面的encode的方法,根据参数不同,进 ...

  5. 鼠标划过图片title 提示实现

    鼠标划过图片title 提示实现 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "h ...

  6. apache静态文件配置

    开发环境配置 需要下面几个步骤 1. 在app目录下创建static目录,将静态文件和相关文件夹放到此目录下,如your_app/static/img等 2. 确保settings.py中的INSTA ...

  7. .NET MVC插件化开发框架源码(插件功能完善版)

    离上次第一次上传源码一个多星期了,在工作之余今天终于把插件管理部门的功能全部完善了,已可用于实际开发,管理界面因为没人帮忙设计,所以有点丑,今天这版算是0.1.0.0吧,后面我会发布很多插件来填充这个 ...

  8. Qt经典—线程、事件与Qobject(耳目一新)

    介绍 You’re doing it wrong. — Bradley T. Hughes 线程是qt channel里最流行的讨论话题之一.许多人加入了讨论并询问如何解决他们在运行跨线程编程时所遇到 ...

  9. pl/sql 在一个程序块里打印日志输出到表格

    declare v_number NUMBER; v_number2 NUMBER; begin execute immediate 'truncate table t2'; insert into ...

  10. 【转】Android点击空白区域,隐藏输入法软键盘

    原文网址:http://www.2cto.com/kf/201505/401382.html 很多时候,我们在使用应用时,会出现输入法软键盘弹出的问题,通常情况下,我们默认会使用户点击返回键或者下一步 ...