二叉樹和紅黑樹的java實現

2021-08-25 16:03:46 字數 3974 閱讀 5313

二叉查詢樹**大致如下:

二叉樹節點類:

package rbtree;

public class bstreenode

二叉樹的功能實現類:

package rbtree;

public class bstree

if (y == null)

t.root = node;

else if (y.data > node.data)

y.lchild = node;

else

y.rchild = node;

}// 查詢

public bstreenode searchnode(bstreenode node, int data) else if (node.data > data)

return searchnode(node.lchild, data);

else

return searchnode(node.rchild, data);

}//列印二叉樹

public void bstreedisplay(bstreenode t, int h) else

}}

紅黑樹

紅黑樹節點類:

package rbtree;

public class rbtreenode

紅黑樹功能類:

package rbtree;

public class rbtree

// 插入乙個節點

public void rbtreeinsert(rbtree t,int data)

// 刪除節點

public rbtreenode rbdelete(rbtree t,rbtreenode node)

if(y.color == "b")

return y;

}// 刪除的調整

private void rbdeletefixup(rbtree t, rbtreenode x)

if(w.lchild.color == "b" && w.rchild.color == "b")

else

w.color = x.parent.color;

x.parent.color = "b";

w.rchild.color ="b";

leftrotate( t, x.parent);

x = t.root;}}

else

if(w.lchild.color == "b" && w.rchild.color == "b")

else

w.color = x.parent.color;

x.parent.color = "b";

w.rchild.color ="b";

rightrotate( t, x.parent);

x = t.root;}}

} x.color = "b";

} private rbtreenode treesuccessor(rbtreenode node)

return y;

} private rbtreenode treemin(rbtreenode node)

public int rbtreeblackheight(rbtreenode t)

// 列印紅黑樹

public void rbtreedisplay(rbtreenode t,int h)

功能類:

package rbtree;

public class exrbtree

public void exrbtreeinsert(exrbtree t,int data)

public void setexrbtreesize(exrbtree t,int data)

public int exrbtreegetrank(exrbtree t,int data)

return r; }

public void exrbtreedisplay(exrbtreenode t,int h);

for (int i = 0; i < arr.length; i++)

t1.rbtreeinsert(t1, arr[i]);

system.out.println("插入後紅黑樹如下");

t1.rbtreedisplay(t1.root, 0);// 列印樹

int bh = t1.rbtreeblackheight(t1.root);// 獲取黑高度

system.out.println("t1黑高度為" + bh);

// 刪除15元素後得到樹並列印

rbtreenode q = null;

q = t1.rbdelete(t1, t1.rbtreesearch(t1.root, 15));

system.out.println("刪除的節點資訊為" + q.data + q.color + ", 刪除後樹形如下:");

t1.rbtreedisplay(t1.root, 0);// 列印樹

bh = t1.rbtreeblackheight(t1.root);// 獲取黑高度

system.out.println("刪除節點15後,t1黑高度為" + bh);

// 隨機生成1-300000個不同的數值 分別插入二叉樹bt與紅黑樹t 比較查詢15000的時間代價

arraylist arrlist = new arraylist();

for (int i = 0; i < 300000; i++)

arrlist.add(i + 1);

for (int i = 0; i < 300000; i++)

// 二叉樹中查詢15000節點

bstreenode p = null;

long time = system.nanotime();

; p = bt.searchnode(bt.root, 15000);

long span = system.nanotime() - time;

system.out.println(p.data);

long b = system.currenttimemillis();

system.out.println("二叉樹查詢時間為:" + span + "納秒");

// 紅黑樹中查詢15000節點

time = system.nanotime();

q = t.rbtreesearch(t.root, 15000);

span = system.nanotime() - time;

system.out.println(q.data + q.color);

system.out.println("紅黑樹查詢時間為:" + span + "納秒");

// 輸出秩 為此建立了擴充套件紅黑樹exrbtree

exrbtree t2 = new exrbtree();

int arr1 = ;

for (int i = 0; i < arr1.length; i++)

t2.exrbtreeinsert(t2, arr1[i]);

system.out.println("插入後紅黑樹如下【格式為資料值 、節點顏色、size域】");

for (int i = 0; i < arr1.length; i++)

t2.setexrbtreesize(t2, arr1[i]);

t2.exrbtreedisplay(t2.root, 0);

int k = t2.exrbtreegetrank(t2, 6);

system.out.println("key值為6的rank為:" + k);

}}

ps:很久以前自己寫的**了,這裡整理了一下,搬到部落格來,其中功能不是很完整,比如二叉樹就沒有寫刪除功能。

二叉樹 紅黑樹

也就是說,二叉排序樹中,左子樹都比節點小,右子樹都比節點大,遞迴定義。根據二叉排序樹這個特點我們可以知道,二叉排序樹的中序遍歷一定是從小到大的,比如上圖,中序遍歷結果是 1 3 4 6 7 8 10 13 14 效能取決於 public class demo public static void m...

紅黑二叉樹

紅黑二叉樹 紅黑二叉樹的基本思想是想用標準的二叉查詢樹 完全由2 結點構成 和一些額外的資訊 替換3 結點 來表述2 3樹。或者說,我們將3 結點表示為由一條左斜的紅色鏈結相 兩個2 結點其中之一是另乙個的左子節點 連的兩個2 結點。這種表示的優點 我們無需修改就可以直接使用標準二叉查詢樹的get ...

二叉樹(三) 紅黑樹

紅黑樹是一種自平衡的二叉查詢樹,可解決二叉查詢樹因為多次插入新節點導致的不平衡問題。除了二叉查詢樹的基本特性外,還具有下列的特性 1 節點是紅色或者黑色 2 根節點是黑色 3 每個葉子節點都是黑色的空節點 nil節點 4 每個紅色節點的兩個子節點都是黑色。從每個葉子到根的所有路徑上不能有兩個連續的紅...