树:
树是一种数据结构,它是由n(n>=1)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:
每个结点有零个或多个子结点;没有父结点的结点称为根结点;每一个非根结点有且只有一个父结点;除了根结点外,每个子结点可以分为多个不相交的子树。
二叉树:
如图,树的一种特殊的形式,他只有两个分支,即左子树和右子树,则我们称这种特殊的树为二叉树。
二叉树的遍历方式:
简单的口诀:
一、 先根遍历
1. 访问根节点。
2. 先根遍历左子树。
3. 先根遍历右子树
简称 中左右
如图:A BD# CE#
二、 中根遍历
1. 中根遍历左子树
2. 访问根节点
3. 中根遍历右子树
简称 左中右
如图:DB# A EC#
三、 后根遍历
1. 中根遍历左子树
2. 中根遍历右子树
3. 访问根节点
简称 左右中
如图:D#B E#C A
把左子树看成前,根看成中,右子树看成后,遍历时把左右子树看成整体,进行遍历,是一种递归的过程。可以看的到,我中间加了空格,空格的意思就是分成三个整体部分,依次遍历得出结果。
代码实现:
package com.usts.edu.tree;
/**
* Created by Guanzhong Hu
* Date :2019/12/29
* Description : 二叉树的链式存储结构
* Version :1.0
*/
public class BiTreeNode {
public Object data;
public BiTreeNode lchild,rchild; // 左右孩子
public BiTreeNode(){ // 空构造函数
this(null);
}
public BiTreeNode(Object data){
this(data,null,null);
}
public BiTreeNode(Object data,BiTreeNode lchild,BiTreeNode rchild){ // 赋值
this.data = data;
this.lchild = lchild;
this.rchild = rchild;
}
}
package com.usts.edu.tree;
/**
* Created by Guanzhong Hu
* Date :2019/12/29
* Description : 二叉链式存储结构
* Version :1.0
*/
public class BiTree {
private BiTreeNode root; // 根节点
private static int index = 0; // 用于记录先根遍历的索引值
public BiTree() {
this.root = null; // 初始化,根节点为空
}
public BiTree(BiTreeNode root) {
this.root = root; // 生成第一棵树
}
// 先跟遍历和中根遍历创建一颗二叉树
public BiTree(String preOrder,String inOrder, int preIndex,int inIndex,int count){
if (count>0){
char r = preOrder.charAt(preIndex);
int i = 0;
for (;i<count;i++) {
if (r == inOrder.charAt(i + inIndex)) break;
}
root = new BiTreeNode(r);
root.lchild = new BiTree(preOrder,inOrder,preIndex+1,inIndex,i).root;
root.rchild = new BiTree(preOrder,inOrder,preIndex+1+i,inIndex+i+1,count-i-1).root;
}
}
/**
* 遍历二叉树
* -------------
* 一、 先根遍历
* 1. 访问根节点。
* 2. 先根遍历左子树。
* 3. 先根遍历右子树
* 简称 中左右
* -------------
* 二、 中根遍历
* 1. 中根遍历左子树
* 2. 访问根节点
* 3. 中根遍历右子树
* 简称 左中右
* -------------
* 三、 后根遍历
* 1. 中根遍历左子树
* 2. 中根遍历右子树
* 3. 访问根节点
* 简称 左右中
* -------------
*/
// ==========递归执行遍历二叉树=============
// 先跟遍历 按方法一 执行
public void preRootTraverse(BiTreeNode T){
if (T!=null){
System.out.println(T.data);
preRootTraverse(T.lchild);
preRootTraverse(T.rchild);
}
}
// 中跟遍历\/
public void inRootTraverse(BiTreeNode T){
if (T!=null){
inRootTraverse(T.lchild);
System.out.println(T.data);
inRootTraverse(T.rchild);
}
}
// 后根遍历
public void postRootTraverse(BiTreeNode T){
if (T!=null){
postRootTraverse(T.lchild);
postRootTraverse(T.rchild);
System.out.println(T.data);
}
}
// ==========递归执行遍历二叉树=============
public BiTreeNode getRoot(){
return root;
}
public void setRoot(BiTreeNode root) {
this.root = root;
}
}
package com.usts.edu.tree;
/**
* Created by Guanzhong Hu
* Date :2019/12/29
* Description :树的生成遍历测试类
* Version :1.0
*/
public class TreeTest {
public static void main(String[] args) {
BiTree tree = createBiTree();
BiTreeNode root = tree.getRoot();
tree.postRootTraverse(root);
tree.preRootTraverse(root);
}
public static BiTree createBiTree(){
BiTreeNode d = new BiTreeNode("D");
BiTreeNode g = new BiTreeNode("G");
BiTreeNode h = new BiTreeNode("H");
BiTreeNode e = new BiTreeNode("E",g,null);
BiTreeNode b = new BiTreeNode("B",d,e);
BiTreeNode f = new BiTreeNode("F",null,h);
BiTreeNode c = new BiTreeNode("C",f,null);
BiTreeNode a = new BiTreeNode("A",b,c);
return new BiTree(a);
}
}
gitee源码地址:
https://gitee.com/jockhome/data_structure