package org.lulu.learn;
/**
* Project: Day06
* Created: Lulu
* Date: 2016/8/3
* <p>
* 如何用树形结构存储数据
*/
// 必须让类型自己可以比较, 泛型不可以用实现implements 关键字
public class TreeNode<T extends Comparable<T>> {
private T data;
//这样可以让left赋值其子类<? extends T>
private TreeNode<T> left;
private TreeNode<T> right;
private TreeNode<T> parent;//父节点
public TreeNode(T data) {
this.data = data;
}
public void add(T t) {
if(data == null){
data = t;
return;
}
int i = data.compareTo(t);//比较结果
if (i < 0) {//说明data < t
if (right == null) {
right = new TreeNode<T>(t);
right.parent = this;
} else {
right.add(t);
}
} //此处不能用else因为还有i = 0的情况, 就不做处理
if (i > 0) {
if (left == null) {
left = new TreeNode<T>(t);
left.parent = this;
} else {
left.add(t);
}
}
}
//删除非叶结点: 可以找该节点的左侧节点的最右边的值
//或者找该节点的右侧节点的最左边的值提上来
public void remove(T t) {
//首先找到要删除的节点位置
int i = data.compareTo(t);
if (i > 0) {
left.remove(t);
}
if (i < 0) {
right.remove(t);
}
//要删除的就是当前的节点
if (i == 0) {
//判断是否是删除根节点?
if(parent != null){
//非根
if (right != null) {
if(right.left != null){
data = right.removeFinalLeft();
}else{
data = right.data;
right = right.right;
}
} else if (left != null) {
if(left.right != null){
data = left.removeFinalRight();
}else{
data = left.data;
left = left.left;
}
} else {//叶子
//判断一下应该删除左右哪个节点
if(data.compareTo(parent.data) > 0){
parent.right = null;
}else{
parent.left = null;
}
}
}else{
//删除根节点的情况
if(right != null){
if(right.left != null){
data = right.removeFinalLeft();
}else{
data = right.data;
right = right.right;
}
} else if(left != null){
//左侧
if(left.right != null){
data = left.removeFinalRight();
}else{
data = left.data;
left = left.left;
}
}else{
//只有根节点
data = null;
left = null;
right = null;
}
}
}
}
private T removeFinalLeft() {
if (left.left == null) {
T data = left.data;
left = left.right;
return data;
} else {
return left.removeFinalLeft();
}
}
private T removeFinalRight() {
if (right.right == null) {
T data = right.data;
right = right.left;
return data;
}else{
return right.removeFinalRight();
}
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
if (left != null) {
builder.append(left.toString());
builder.append(", ");
}
builder.append(data);
if (right != null) {
builder.append(", ");
builder.append(right.toString());
}
return builder.toString();
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public TreeNode<T> getLeft() {
return left;
}
public void setLeft(TreeNode<T> left) {
this.left = left;
}
public TreeNode<T> getRight() {
return right;
}
public void setRight(TreeNode<T> right) {
this.right = right;
}
public TreeNode<T> getParent() {
return parent;
}
public void setParent(TreeNode<T> parent) {
this.parent = parent;
}
}
补充-昨天使用二叉树存储数据的实现
最新推荐文章于 2022-09-22 09:23:42 发布