二叉树 - 建立与遍历使用Java
二叉树的遍历(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的更多相关文章
- 二叉树建立,遍历和二叉排序树的判断【c++】
// test.cpp : Defines the entry point for the console application. // #include "stdafx.h" ...
- 二叉树的层次遍历(Java代码实现)
与树的前中后序遍历的DFS思想不同,层次遍历用到的是BFS思想.一般DFS用递归去实现(也可以用栈实现),BFS需要用队列去实现. 层次遍历的步骤是: 1.对于不为空的结点,先把该结点加入到队列中 2 ...
- 二叉树建立及遍历 C++ 源码
#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include <stdlib.h> using namespace s ...
- 数据结构二叉树的递归与非递归遍历之java,javascript,php实现可编译(1)java
前一段时间,学习数据结构的各种算法,概念不难理解,只是被C++的指针给弄的犯糊涂,于是用java,web,javascript,分别去实现数据结构的各种算法. 二叉树的遍历,本分享只是以二叉树中的先序 ...
- Java实现二叉树及相关遍历方式
Java实现二叉树及相关遍历方式 在计算机科学中.二叉树是每一个节点最多有两个子树的树结构.通常子树被称作"左子树"(left subtree)和"右子树"(r ...
- 数据结构代码整理(线性表,栈,队列,串,二叉树,图的建立和遍历stl,最小生成树prim算法)。。持续更新中。。。
//归并排序递归方法实现 #include <iostream> #include <cstdio> using namespace std; #define maxn 100 ...
- C语言二叉树的建立与遍历
二叉树的建立和遍历都要用到递归,先暂时保存一下代码,其中主要是理解递归的思想,其它的就都好理解了.这里是三种遍历方式,其实理解一种,其它的几个就都理解了,就是打印出来的顺序不一样而已.建立和遍历的方式 ...
- 二叉树3种递归和非递归遍历(Java)
import java.util.Stack; //二叉树3种递归和非递归遍历(Java) public class Traverse { /******************一二进制树的定义*** ...
- 二叉树遍历(Java实现)
二叉树遍历(Java实现) 主要是二叉树的遍历,包括递归遍历和非递归遍历 import java.util.ArrayDeque; import java.util.ArrayList; impo ...
随机推荐
- 网页中使用CSS和JS阻止用户选择内容
CSS实现 body{ -webkit-user-select:none; -moz-user-select:none; -ms-user-select:none; user-select:none; ...
- 【原创+史上最全】Nginx+ffmpeg实现流媒体直播点播系统
#centos6.6安装搭建nginx+ffmpeg流媒体服务器 #此系统实现了视频文件的直播及缓存点播,并支持移动端播放(支持Apple和Android端) #系统需要自行安装,流媒体服务器配置完成 ...
- cpp(第八章)
1. #include <iostream> inline int add(int &n) { n= n+; ; } int main() { using namespace st ...
- 第45篇 js操作打开本地程序
原文地址:http://blog.laofu.online/2017/06/10/how-js-controlApp/ 背景 假设有这样一个产品,一个web和一个winform客户端,在客户在web的 ...
- 基于C#的接口自动化测试(一)
其实就是找个地方然后给关键的代码做个笔记什么的-- 字符串访问API接口,访问方法为POST: string url = URL; string RequestParam = Param; strin ...
- JavaScript面向对象之Windows对象
JavaScript之Window对象 首先我们先了解一个概念:事件. 事件,就是把一段代码设置好,满足条件时触发.或者说,事件是可以被 JavaScript 侦测到的行为. 网页中每个元素都可以触发 ...
- 委托(C#)
委托,delegate 关键字用于声明一个引用类型,该引用类型可用于封装命名方法或匿名方法.委托类似于 C++ 中的函数指针:但是,委托是类型安全和可靠的.委托类型声明的格式如下: public de ...
- Jquery DataTables 使用AJAX POST的问题
最近项目在用需要用表格,听说DataTables很好很强大,于是用了一下. Get请求没什么问题,问题处在POST请求上 Jquery原生的POST请求没有问题,代码如下 $.ajax({ url ...
- Linux文件管理浅析(一) _磁盘管理基础
本文主要讨论一些磁盘管理相关的基本概念,同时也是这一系列文章的第一篇,就是下图中的最下一层的一部分. 在Linux中,SATA/USB/SCSI接口都是使用SCSI模块实现的,所以使用这些接口的硬盘在 ...
- eclipse快捷键 自己使用简单总结
ctrl+shift+O 清理代码引用的多余类 ctrl+shift+R 打开指定文件