二叉树图:

    

package com.test.Sort;

import java.util.ArrayList;
import java.util.LinkedList; public class Binary_Tree {
//java实现二叉树实现
public static void main(String[] args) {
Tree t =new Tree();
t.add("A");
t.add("B");
t.add("C");
Node root = t.getRoot();
//先序遍历
System.out.println("先序遍历:");
t.Preorder(root);
System.out.println("------------------------");
//中序遍历
System.out.println("中序遍历:");
t.inOrder(root);
System.out.println("------------------------");
//后序遍历
System.out.println("后序遍历:");
t.postOrder(root);
} } //节点类
class Node{
//头节点
private String node;
//左节点
private Node iLnode;
//右节点
private Node iRnode; public Node(String node){
this.node = node;
} public String getNode() {
return node;
} public void setNode(String node) {
this.node = node;
} public Node getiLnode() {
return iLnode;
} public void setiLnode(Node iLnode) {
this.iLnode = iLnode;
} public Node getiRnode() {
return iRnode;
} public void setiRnode(Node iRnode) {
this.iRnode = iRnode;
}
} //创建二叉树
class Tree{
private Node root;
public Tree(){}; public Node getRoot() {
return root;
} public void setRoot(Node root) {
this.root = root;
} /**
*
* 递归实现先序遍历
* 先序遍历 在先序遍历中,我们先访问根节点,然后递归使用先序遍历访问左子树,再递归使用先序遍历访问右子树
* 根节点->左子树->右子树
* 他的顺序是:
* A
* B C
*
* 先序遍历是:A为根节点,左子数节点B,右子数节点C
* **/
public void Preorder(Node node){
//如果先序遍历的根节点是空的,直接退出
if(node==null)
return;
System.out.println(node.getNode());
Preorder(node.getiLnode());
Preorder(node.getiRnode());
} /**
* 中序遍历
*
* 中序遍历:左子数节点B,A为根节点,右子数节点C
*
* **/
public void inOrder(Node node){
//如果先序遍历的根节点是空的,直接退出
if(node==null)
return;
inOrder(node.getiLnode());
System.out.println(node.getNode());
inOrder(node.getiRnode());
} /**
* 后序遍历
* 后序遍历:左子数节点B,右子数节点C,A为根节点,
*
* **/
public void postOrder(Node node){
//如果先序遍历的根节点是空的,直接退出
if(node==null)
return;
postOrder(node.getiLnode());
postOrder(node.getiRnode());
System.out.println(node.getNode());
} public void add(String elem){
Node node = new Node(elem);
//如果二叉树节点是空的
if(root==null){
//把传递进去的node传递给root,此时root有数据
root = node;
return;
}else{
//定义个list列表
LinkedList linkedList =new LinkedList();
//列表中添加root节点数据
linkedList.add(root);
//如果列表不为空
while(!linkedList.isEmpty()){
//移出第一个元素
Node element = (Node) linkedList.pop();
if(element.getiLnode()==null){
//左节点为空,设置左节点
element.setiLnode(node);
return;
}else if(element.getiRnode()==null){
//右节点为空,设置右节点
element.setiRnode(node);
return;
}else{
//如果左右子树都不为空,继续加入数据
linkedList.add(element.getiLnode());
linkedList.add(element.getiRnode());
}
}
}
}
}

   输出:

    

  一个抽象概念:  

    

同一个对象调用方法
以二叉树为例:
只有add方法,当add(a)时, 那么此时头节点就是a,当add(b)的时候,头节点不会是b,b只能左节点和右节点。 如果是不同的对象调用add方法,那么头节点是a也可以是b
原理:同一个对象之间数据互相影响
不同对象的之间互不干涉

数据结构(5):Java实现二叉树的更多相关文章

  1. 【Java】 二叉树的遍历(递归与循环+层序遍历)

    在[Java] 大话数据结构(9) 树(二叉树.线索二叉树)一文中,已经实现了采用递归方法的前.中.后序遍历,本文补充了采用循环的实现方法.以及层序遍历并进行了一个总结. 递归实现 /* * 前序遍历 ...

  2. 20172332 2017-2018-2 《程序设计与数据结构》Java哈夫曼编码实验--哈夫曼树的建立,编码与解码

    20172332 2017-2018-2 <程序设计与数据结构>Java哈夫曼编码实验--哈夫曼树的建立,编码与解码 哈夫曼树 1.路径和路径长度 在一棵树中,从一个结点往下可以达到的孩子 ...

  3. Java实现二叉树的先序、中序、后序、层序遍历(递归和非递归)

    二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易 ...

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

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

  5. 数据结构:JAVA实现二叉查找树

    数据结构:JAVA实现二叉查找树 写在前面 二叉查找树(搜索树)是一种能将链表插入的灵活性与有序数组查找的高效性结合在一起的一种数据结构. 观察二叉查找树,我们发现任何一个节点大于左子节点且小于其右子 ...

  6. 数据结构与算法——常用高级数据结构及其Java实现

    前文 数据结构与算法--常用数据结构及其Java实现 总结了基本的数据结构,类似的,本文准备总结一下一些常见的高级的数据结构及其常见算法和对应的Java实现以及应用场景,务求理论与实践一步到位. 跳跃 ...

  7. java实现二叉树的Node节点定义手撕8种遍历(一遍过)

    java实现二叉树的Node节点定义手撕8种遍历(一遍过) 用java的思想和程序从最基本的怎么将一个int型的数组变成Node树状结构说起,再到递归前序遍历,递归中序遍历,递归后序遍历,非递归前序遍 ...

  8. python数据结构之树和二叉树(先序遍历、中序遍历和后序遍历)

    python数据结构之树和二叉树(先序遍历.中序遍历和后序遍历) 树 树是\(n\)(\(n\ge 0\))个结点的有限集.在任意一棵非空树中,有且只有一个根结点. 二叉树是有限个元素的集合,该集合或 ...

  9. 数据结构-堆 Java实现

    数据结构-堆 Java实现. 实现堆自动增长 /** * 数据结构-堆. 自动增长 * */ public class Heap<T extends Comparable> { priva ...

随机推荐

  1. 换人!golang面试官:连怎么避免内存逃逸都不知道?

    问题 怎么避免内存逃逸? 怎么答 在runtime/stubs.go:133有个函数叫noescape.noescape可以在逃逸分析中隐藏一个指针.让这个指针在逃逸分析中不会被检测为逃逸. // n ...

  2. 如何吃透Python的面向对象(OOP)

    ​本篇可乐和大家一起来吃透 Python 的面向对象,类和实例. 面向对象(OOP) 解释:面向对象它是一种编程的思想,将现实事物抽象化为编程对象. 举例说明:喝可乐 ① 选择自己根据配方买对应的材料 ...

  3. 【转+】以C++为核心语言的高频交易系统的讨论

    [前言]高频交易是量化交易的核心.主要分两个方向:计算机技术和交易策略.策略各有不同,一般都是数据分析的专家或者金融,机器学习从业者.在计算机技术方面,一个是交易平台的性能,二者是硬件的性能,延时的多 ...

  4. mac 下如何轻松安装神器 Anaconda

    本文推荐使用homebrew 安装 1.打开终端执行 brew cask install anaconda3 然后就可以喝一杯咖啡了,终端会自动执行安装好 如果终端卡在update homebrew ...

  5. 话说 wait、notify 、 notifyAll

    一.前言 说起java的线程之间的通信,难免会想起它,他就是 wait .notify.notifyAll 他们三个都是Object类的方法, 受到 final 和 native 加持 ,也就造就了他 ...

  6. CCF(地铁修建):向前星+dijikstra+求a到b所有路径中最长边中的最小值

    地铁修建 201703-4 这题就是最短路的一种变形,不是求两点之间的最短路,而是求所有路径中的最长边的最小值. 这里还是使用d数组,但是定义不同了,这里的d[i]就是表示从起点到i的路径中最长边中的 ...

  7. 14. vue源码入口+项目结构分析

    一. vue源码 我们安装好vue以后, 如何了解vue的的代码结构, 从哪里下手呢? 1.1. vue源码入口 vue的入口是package.json 来分别看看是什么含义 dependences: ...

  8. Codeforces Round #684 (Div. 2)

    A 讨论三种情况,不换/全换成0/全换成1 ,取一个花费最小值 #include <bits/stdc++.h> using namespace std; const int N = 10 ...

  9. 【H264】视频编码发展简史

    一.常见视频编码格式 编码格式有很多,如下图: 目前比较常用的编码有: H26x系列:由ITU(国际电传视讯联盟)主导,侧重网络传输 MPEG系列:由ISO(国际标准组织机构)下属的MPEG(运动图象 ...

  10. 【图像处理】OpenCV+Python图像处理入门教程(五)阈值处理

    这篇随笔介绍使用OpenCV进行图像处理的第五章 阈值处理. 5  阈值处理 阈值是指像素到达某临界值.阈值处理表示像素到达某临界值后,对该像素点进行操作和处理. 例如:设定一幅图像素阈值为200,则 ...