Java 實現二叉樹 kaki的博客
二叉樹圖
二叉樹實現代碼
package com.icbc.common;
/**
* @author Kaki Nakajima
* @desc 二叉樹
* @date 2019.05.24
*/
public class MyTree {
//根節點
private Node root;
private class Node{
public Node(Object data){
this.data = data;
}
Node left;
Node right;
Node parrent;
Object data;
}
//查找父節點
private Node findParrent(Node curentNode,Object data){
Node parrent = curentNode;
Node node = curentNode;
while (node != null){
//記錄父節點
parrent = node;
//比較
if(compare(node.data, data)){
//左找
node = node.left;
}else {
node = node.right;
}
}
return parrent;
}
//比較大小
private boolean compare(Object o1,Object o2){
boolean res = false;
if(o1 instanceof Comparable){
Comparable c1 = (Comparable)o1;
Comparable c2 = (Comparable)o2;
if(c1.compareTo(c2)>0){
res = true;
}
}else {
if(o1.toString().compareTo(o2.toString())>0){
res = true;
}
}
return res;
}
//添加
public void add(Object data){
Node node = find(data);
if(node == null){
//不存在,就添加
node = new Node(data);
//判斷添加在哪個位置
if(root == null){
root =node;
}else {
//查詢父節點
Node parrent = findParrent(root, data);
node.parrent = parrent;
//判斷插在父節點的左邊還是右邊
if(compare(parrent.data, data)){
//比父節點大,就放在父節點左邊
parrent.left = node;
}else {
//比父節點小,就放在父節點右邊
parrent.right = node;
}
}
}else {
//該數據已存在,不添加
}
}
//查找數據在二叉樹中的位置
private Node find(Object data){
//從跟節點開始遍歷
Node temp = root;
while (temp != null){
if(temp.data.equals(data)&& temp.data.hashCode() == data.hashCode()){
//找到了
break;
}else {
if(compare(temp.data, data)){
//左邊找
temp= temp.left;
}else {
//右邊找
temp = temp.right;
}
}
}
return temp;
}
// 打印
public void print(){
print(root);
}
//迭代二叉樹的數據
private void print(Node node){
if(node == null){
return;
}else {
print(node.left);
System.out.println(node.data);
print(node.right);
}
}
public void remove(Object data) {
// 1. 查找數據的位置
Node node = find(data);
// 2. 存在刪除
if (node != null) {
// 存在
if (node == root) {
// 刪除根節點
if (node.left == null && node.right == null) {
// 沒有兒子
root = null;
} else if (node.left == null) {
// 只有右兒子
root = node.right;
root.parrent = null;
} else if (node.right == null) {
// 只有左兒子
root = node.left;
root.parrent = null;
} else {
// 連個兒子都有
Node left = splitNode(node);// 分裂節點
// 繼位
root = left;
root.parrent = null;
}
} else {
// 刪除非根節點
// 刪除根節點
if (node.left == null && node.right == null) {
// 沒有兒子
// 刪除node
if (compare(node.data, node.parrent.data)) {
// 在父節點的右邊
node.parrent.right = null;
} else {
// 在父節點的左邊
node.parrent.left = null;
}
} else if (node.left == null) {
// 只有右兒子
if (compare(node.data, node.parrent.data)) {
// 在父節點的右邊
node.parrent.right = node.right;
} else {
// 在父節點的左邊
node.parrent.left = node.right;
}
node.right.parrent = node.parrent;
} else if (node.right == null) {
// 只有左兒子
// 只有右兒子
if (compare(node.data, node.parrent.data)) {
// 在父節點的右邊
node.parrent.right = node.left;
} else {
// 在父節點的左邊
node.parrent.left = node.left;
}
node.left.parrent = node.parrent;
} else {
// 連個兒子都有
Node left = splitNode(node);// 分裂節點
if (compare(left.data, node.parrent.data)) {
//右邊
node.parrent.right = left;
left.parrent = node.parrent;
} else {
//左邊
node.parrent.left = left;
left.parrent = node.parrent;
}
}
}
}
}
/**
* 分裂節點
*
* @param slitNode
* @return
*/
private Node splitNode(Node slitNode) {
// 保留左兒子
Node left = slitNode.left;
// 處理右兒子節點,把右兒子放到左兒子的最右邊
Node parrent = findParrent(left, slitNode.right.data);
// 重組節點
parrent.right = slitNode.right;
slitNode.right.parrent = parrent;
return left;
}
}
歡迎點贊關注收藏哦 ,碼雲搜索KakiNakajima