二叉树 - 建立与遍历使用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 ...
随机推荐
- NLTK学习笔记(一):语言处理和Python
目录 [TOC] nltk资料下载 import nltk nltk.download() 其中,download() 参数默认是all,可以在脚本里面加上nltk.download(需要的资料库) ...
- Python一键升级所有 模块/package
import os,time allPackage=os.popen('pip list') allPackage=allPackage.read() allPackage=allPackage.sp ...
- MySQL分页优化中的“INNER JOIN方式优化分页算法”到底在什么情况下会生效?
本文出处:http://www.cnblogs.com/wy123/p/7003157.html 最近无意间看到一个MySQL分页优化的测试案例,并没有非常具体地说明测试场景的情况下,给出了一种经典的 ...
- vue-router如何根据不同的用户给不同的权限
闲聊: 小颖去年在上家公司用的vue1.0之前在做路由这块用的router.map,但是现在vue2.0里已经不能用了,所以之前解决权限问题的例子,小颖也参考不了呜呜 之前看一个美女写的:elemem ...
- 使用hashCode()和equals()方法 - Java
在这篇文章中,我将指出我对hashCode()和equals()方法的理解.我将讨论它们的默认实现以及如何正确地覆盖它们.我还将使用Apache Commons包中的实用工具类来实现这些方法. has ...
- Hibernate入门(二)
一 Hibernate使用注解 可以使用注解创建Hibernate程序,使用注解的优点是不用创建映射文件,直接创建对象的关联. 使用hibernate注解需要导入注解相关的JAR包. 1.下载JAR包 ...
- Perl格式化输出
Perl格式化输出 问题阐述 有时我们需要大量的重复数据,使用手工易于出错及比较繁琐.抓取特征,可以使用Perl脚本轻松搞定. 输出数据格式 主要特点 随机数生成 格式化输出 序列递增 Perl脚本 ...
- Linux命令 查看文件内容
cat [功能说明] 查看文件的内容 #cat本身是一个串接命令,把指定一个或多个源文件的内容,利用>符号重定向到目标文件中,如果不指定重定向文件,则默认在标准输出设备上显示.此时,可以利用c ...
- Zab: A simple totally ordered broadcast protocol(译)
摘要 这是一个关于ZooKeeper正在使用的全序广播协议(Zab)的简短概述.它在概念上很容易理解,也很容易实现,并且提供很高的性能.在这篇文章里,我们会呈现ZooKeeper在Zab上的需求,也会 ...
- 20170422早会训话,ps:程序出现两次BUG,领导很生气
针对这种问题: 要讲3点 1.有没有拖团队后腿: 作为一名前端开发人员,对于前端开发的任务,我能够在第一时间完成,保证时间进度,但光做到这一点是不够的,不能只讲究任务,不考虑结果,会不会出现问题造成其 ...