二叉查詢樹**大致如下:
二叉樹節點類:
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 每個紅色節點的兩個子節點都是黑色。從每個葉子到根的所有路徑上不能有兩個連續的紅...