二叉树的遍历(traversing binary tree)是指从根节点出发,按照某种次序依次访问二叉树中所有节点,使得每个节点仅被访问一次

前序遍历:若二叉树为空,则空操作返回null。否则先访问根节点,然后前序遍历左子树,再前序遍历右子树

中序遍历:若二叉树为空,则空操作返回null。否则从根节点开始,中序遍历根节点左子树,然后访问根节点,最后中序遍历右子树

后序遍历:若二叉树为空,则空操作返回null。否则以从左到右先叶子后节点的方式遍历访问左右子树,最后访问根节点

层序遍历:若树为空,空操作返回null。否则从树的第一层,也就是根节点开始访问,从上而下逐层遍历,在同一层中,从左到右对结点逐个访问

com

└── rust

└── datastruct

├── BinaryTree.java

└── TestBinaryTree.java

二叉树用一个类来实现,并包含内部类节点

以下是Java代码:

 package com.rust.datastruct;

 public class BinaryTree {
     private int BinaryNodeCount = 0;
     BinaryNode root;
     public BinaryTree(){}

     public BinaryNode createRoot(){
         return createRoot(1,null);
     }
     public BinaryNode createRoot(int key,String data){
         BinaryNode root = new BinaryNode(key, data);
         this.root = root;
         return root;
     }

     public BinaryNode createNode(int key,String data){
         return new BinaryNode(key,data);
     }
     public int getNodeCount(){
         return BinaryNodeCount;
     }
     public BinaryNode getRoot(){
         return root;
     }
     public void visitNode(BinaryNode node){
         if (node == null) {
             return ;
         }
         node.setVisited(true);
         System.out.print(node.getData());
     }
     // 前序遍历
     public void preOrderTravels(BinaryNode node) {
         if (node == null) {
             return;
         } else {
             BinaryNodeCount++;
             visitNode(node);
             preOrderTravels(node.leftChild);
             preOrderTravels(node.rightChild);
         }
     }
     // 中序遍历
     public void midOrderTravels(BinaryNode node) {
         if (node == null) {
             return;
         } else {
             BinaryNodeCount++;
             midOrderTravels(node.leftChild);
             visitNode(node);
             midOrderTravels(node.rightChild);
         }
     }
     // 后序遍历
     public void postOrderTravels(BinaryNode node) {
         if (node == null) {
             return;
         } else {
             BinaryNodeCount++;
             postOrderTravels(node.leftChild);
             postOrderTravels(node.rightChild);
             visitNode(node);
         }
     }  

     class BinaryNode{
         private int key;
         private String data;
         private BinaryNode leftChild = null;
         private BinaryNode rightChild = null;
         private boolean isVisited = false;

         public int getKey() {
             return key;
         }
         public void setKey(int key) {
             this.key = key;
         }
         public String getData() {
             return data;
         }
         public void setData(String data) {
             this.data = data;
         }
         public BinaryNode getLeftChild() {
             return leftChild;
         }
         public void setLeftChild(BinaryNode leftChild) {
             this.leftChild = leftChild;
         }
         public BinaryNode getRightChild() {
             return rightChild;
         }
         public void setRightChild(BinaryNode rightChild) {
             this.rightChild = rightChild;
         }
         public boolean isVisited() {
             return isVisited;
         }
         public void setVisited(boolean isVisited) {
             this.isVisited = isVisited;
         }
         public BinaryNode(){

         }
         public BinaryNode(int key, String data){
             this.key = key;
             this.data = data;
             this.leftChild = null;
             this.rightChild = null;
         }
     }

 }

里面内置前序遍历、中序遍历和后序遍历三种方法

 package com.rust.datastruct;

 import com.rust.datastruct.BinaryTree.BinaryNode;

 public class TestBinaryTree {

     public static void main(String args[]){
         BinaryTree bt = new BinaryTree();
         initTree(bt, 1, "A");
         System.out.println("********preOrderTravels********");
         bt.preOrderTravels(bt.root);
         System.out.println();
         System.out.println("********midOrderTravels********");
         bt.midOrderTravels(bt.root);
         System.out.println();
         System.out.println("********postOrderTravels********");
         bt.postOrderTravels(bt.root);
     }
     /**
      *               A
      *        B            C
      *    D     E      F     G
      * H   I  J
      * @param bt 输入一个二叉树对象,定义一个根结点
      * @param rootKey
      * @param rootData
      */
     public static void initTree(BinaryTree bt,int rootKey, String rootData){
         BinaryNode root = bt.createRoot(rootKey, rootData);
         BinaryNode nodeB = bt.createNode(2, "B");
         BinaryNode nodeC = bt.createNode(3, "C");
         BinaryNode nodeD = bt.createNode(4, "D");
         BinaryNode nodeE = bt.createNode(5, "E");
         BinaryNode nodeF = bt.createNode(6, "F");
         BinaryNode nodeG = bt.createNode(7, "G");
         BinaryNode nodeH = bt.createNode(8, "H");
         BinaryNode nodeI = bt.createNode(9, "I");
         BinaryNode nodeJ = bt.createNode(10, "J");
         root.setLeftChild(nodeB);
         root.setRightChild(nodeC);
         nodeB.setLeftChild(nodeD);
         nodeB.setRightChild(nodeE);
         nodeC.setLeftChild(nodeF);
         nodeC.setRightChild(nodeG);
         nodeD.setLeftChild(nodeH);
         nodeD.setRightChild(nodeI);
         nodeE.setRightChild(nodeJ);
     }
 }

输出:

********preOrderTravels********

ABDHIEJCFG

********midOrderTravels********

HDIBEJAFCG

********postOrderTravels********

HIDJEBFGCA

·树,森林和二叉树

#树转换为二叉树

1.加线,在所有兄弟节点之间加一条线

2.去线,对树中每一个节点,只保留它与第一个孩子结点的连线,删除它与其它孩子节点之间的连线

3.层次调整。以树的根节点为轴心,将整棵树顺时针旋转一定的角度,使其结构分明

#森林转换为二叉树

1.把每棵树转换为二叉树

2.第一棵二叉树不动,从第二棵二叉树开始,依次把后一棵二叉树的根节点作为前一棵二叉树的根节点的右孩子,

用线连起来。当所有的二叉树连接起来后就得到了由森林转换来的二叉树。

#二叉树转换为树

右孩子都跨一层连接上去,删掉二叉树右孩子的连线

#二叉树转换为森林

逐层删掉右孩子的连线

二叉树 - 建立与遍历使用Java的更多相关文章

  1. 二叉树建立,遍历和二叉排序树的判断【c++】

    // test.cpp : Defines the entry point for the console application. // #include "stdafx.h" ...

  2. 二叉树的层次遍历(Java代码实现)

    与树的前中后序遍历的DFS思想不同,层次遍历用到的是BFS思想.一般DFS用递归去实现(也可以用栈实现),BFS需要用队列去实现. 层次遍历的步骤是: 1.对于不为空的结点,先把该结点加入到队列中 2 ...

  3. 二叉树建立及遍历 C++ 源码

    #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include <stdlib.h> using namespace s ...

  4. 数据结构二叉树的递归与非递归遍历之java,javascript,php实现可编译(1)java

    前一段时间,学习数据结构的各种算法,概念不难理解,只是被C++的指针给弄的犯糊涂,于是用java,web,javascript,分别去实现数据结构的各种算法. 二叉树的遍历,本分享只是以二叉树中的先序 ...

  5. Java实现二叉树及相关遍历方式

    Java实现二叉树及相关遍历方式 在计算机科学中.二叉树是每一个节点最多有两个子树的树结构.通常子树被称作"左子树"(left subtree)和"右子树"(r ...

  6. 数据结构代码整理(线性表,栈,队列,串,二叉树,图的建立和遍历stl,最小生成树prim算法)。。持续更新中。。。

    //归并排序递归方法实现 #include <iostream> #include <cstdio> using namespace std; #define maxn 100 ...

  7. C语言二叉树的建立与遍历

    二叉树的建立和遍历都要用到递归,先暂时保存一下代码,其中主要是理解递归的思想,其它的就都好理解了.这里是三种遍历方式,其实理解一种,其它的几个就都理解了,就是打印出来的顺序不一样而已.建立和遍历的方式 ...

  8. 二叉树3种递归和非递归遍历(Java)

    import java.util.Stack; //二叉树3种递归和非递归遍历(Java) public class Traverse { /******************一二进制树的定义*** ...

  9. 二叉树遍历(Java实现)

    二叉树遍历(Java实现)   主要是二叉树的遍历,包括递归遍历和非递归遍历 import java.util.ArrayDeque; import java.util.ArrayList; impo ...

随机推荐

  1. CentOS升级Python2.7导致使用pip等命令安装模块失败

    报错如下: # pip Traceback (most recent call last): File , in <module> from pkg_resources import lo ...

  2. 说说ajax上传数据和接收数据

    我是一个脑袋不太灵光的人,所以遇到问题,厚着脸皮去请教大神的时候,害怕被大神鄙视,但是还是被鄙视了.我说自己不要点脸面,那是不可能的,但是,为了能让自己的技术生涯能走的更长远一些,受点白眼,受点嘲笑也 ...

  3. 学习总结------Servlet控制器的简单运用

    前言: 今天将简单的模拟 MVC模式 对Servlet控制器运行 若有不好或不对的地方,欢迎各位大神进行指导! 1.MVC模式(图) MVC全名是Model View Controller,是模型(m ...

  4. CSS3学习系列之选择器(四)

    使用选择器来插入文字 css2中,使用before选择器在元素前面插入内容,使用after选择器在元素后面插入内容,在选择器的content属性中定义要插入的内容.将content属性值设定为none ...

  5. docker registry私有仓库部署

    私有仓库服务端:12.40[root@centos7_golang ~]# docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry ...

  6. Java数值避免浮点型计算丢失精度问题

    问题描述及方案 假设我们在做电商项目,在进行计算时这个丢失精度在产品价格计算就会出现问题,很有可能造成我们手里有9.99元然后后面会有一堆9,但是呢这些钱无法购买一个10元的商品. 在某些编程语言中有 ...

  7. 【Python3之异常处理】

    一.错误和异常 1.错误 代码运行前的语法或者逻辑错误 语法错误(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正) def test: ^ SyntaxError: inva ...

  8. linux中怎么进入root用户

    如果你是第一次使用root用户,需要设置root用户密码:passwd root 根据提示输入然后切换到root用户:su root回车输入密码 回车

  9. [leetcode-530-Minimum Absolute Difference in BST]

    Given a binary search tree with non-negative values, find the minimum absolute difference between va ...

  10. Ionic 常用组件解析

    Ionic 常用组件解析 $ionicModal(弹出窗口): //创建一个窗口 //此处注意目录的起始位置为app $ionicModal.fromTemplateUrl('app/security ...