二叉树、红黑树
每个树节点只有两个分支的树形数据结构,按照数值左小右大分布
数据结构可视化: https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
二叉树使用:https://www.cs.usfca.edu/~galles/visualization/BST.html
2.写一个二叉树程序
实现添加元素、遍历元素功能
(2)遍历原理:
-
先续遍历: 中 -> 左 -> 右
-
中序遍历: 左 -> 中 -> 右 , 最常见的遍历顺序, 输出结果是排序的!
-
后续遍历: 左 -> 右 -> 中
手写程序如下:
package list;
/**
* 手写二叉树
* @param <T>
*/
public class MyTreeSet<T> {
//根节点
private Node root;
/**
* 内部节点类Node
* @param <T>
*/
private static class Node<T>{
T value;//节点内部存储的值
Node left;//左节点
Node right;//右节点
/**
* 构造方法
* @param e 元素值
*/
public Node(T e){
value = e;
}
/**
* 添加子节点
* @param e
* @return
*/
public boolean addChild(T e){
//先比较大小,如果小了,就加到左侧;如果大了,就加到右侧
//将e转化为可比较的对象obj,转换类型以后就为了调用比较大小方法
Comparable obj = (Comparable)e;
//将obj与value进行比较
int result = obj.compareTo(value);
//obj.compareTo(value) 返回: 0 相等
// 正数 obj>value
// 负数 obj<value
//int result = val.compareTo(root.value);
//1.数据不允许重复,重复就返回false,表示添加失败
if(result==0){
return false;
}else if (result<0){//e<value 向左侧添加
if(left==null){//无左节点
left = new Node(e);//创建一个新的左节点
System.out.println("添加:"+value+"的左侧"+e);
return true;
}else{
return left.addChild(e);//有左节点,递归调用添加节点
}
}else{//e>value 向右侧添加
if(right ==null){
right = new Node(e);
System.out.println("添加:"+value+"的右侧"+e);
return true;
}else{
return right.addChild(e);
}
}
}
/*
* 中序遍历算法
*/
public void appendTo(StringBuilder builder){
//判断是否有左节点
if(left != null){
left.appendTo(builder);//递归拼接左节点
}
//System.out.println("添加:"+value);
builder.append(value).