與鍊錶、堆疊和佇列不一樣,二叉查詢樹不是線性資料結構,是二維資料結構。每個節點都包含乙個leftnode和rightnode,二叉查詢樹把比節點資料項小的資料放在leftnode,把比節點資料項大的資料放在rightnode。
關於節點的類。
publicclass treenode
public treenodeleftnode
public treenoderightnode
public treenode(t element)
publicoverride
string tostring()
if (this.leftnode != null)
if (this.rightnode != null)
nodestring += "]";
return nodestring;
}
}以上,把比節點資料項element小的資料所在節點賦值給leftnode,把比節點資料項element大的資料所在節點賦值給rightnode。
建立乙個泛型二叉樹查詢類,維護著乙個根節點,並提供各種對節點的操作方法。
publicclass binarysearchtree
public binarysearchtree()
//把某個資料項插入到二叉樹
publicvoid insert(t x)
//把某個資料項從二叉樹中刪除
publicvoid remove(t x)
//刪除二叉樹中的最小資料項
publicvoid removemin()
//獲取二叉樹中的最小資料項
public t findmin()
//獲取二叉樹中的最大資料項
public t findmax()
//獲取二叉樹中的某個資料項
public t find(t x)
//清空
publicvoid makeempty()
//判斷二叉樹是否為空,是否存在
publicbool isempty()
//獲取某個節點的資料項
private t elemntat(treenodet)
///
/// 查詢節點
///
/// 要查詢資料項
/// 已存在的節點
/// 返回節點
private treenodefind(t x, treenodet)
elseif ((x as icomparable).compareto(t.element) > 0)
else//如果找到資料項,就返回當前t的值
}
returnnull;
}
//獲取最小的節點,
private treenodefindmin(treenodet)
}
return t;
}
//獲取最大的節點
private treenodefindmax(treenodet)
}
return t;
}
///
/// 插入節點
///
/// 要插入的資料項
/// 已經存在的節點
/// 返回已存在的節點
protected treenodeinsert(t x, treenodet)
elseif ((x as icomparable).compareto(t.element) < 0)
elseif ((x as icomparable).compareto(t.element) > 0)
else
return t;
}
//刪除最小的節點
//返回當前根節點
protected treenoderemovemin(treenodet)
elseif (t.leftnode != null)
else//當t.leftnode=null的時候,就把t.rightnode當作最小節點返回
}
//刪除某資料項,返回當前根節點
protected treenoderemove(t x, treenodet)
elseif((x as icomparable).compareto(t.element) < 0)
elseif ((x as icomparable).compareto(t.element) > 0)
elseif (t.leftnode != null && t.rightnode != null)
else
return t;
}
publicoverride
string tostring()
}客戶端建立二叉查詢樹的例項,並呼叫例項方法插入隨機資料。
binarysearchtree inttree = new binarysearchtree();
random r = new random(datetime.now.millisecond);
string trace = "";
//插入5個隨機數
for (int i = 0; i < 5; i++)
console.writeline("最大的節點:" + inttree.findmax());
console.writeline("最小的節點:" + inttree.findmin());
console.writeline("根節點:" + inttree.root.element);
console.writeline("插入節點的依次順序是:" + trace);
console.writeline("列印樹為:" + inttree);
console.readkey();
參考資料:
binary search trees (bsts) in c#
「了解集合本質必須要知曉的概念」系列包括:
MySQL必須要了解的鎖知識
mysql 的鎖按照範圍可以分為全域性鎖 表鎖 行鎖,其中行鎖是由資料庫引擎實現的,並不是所有的引擎都提供行鎖,myisam 就不支援行鎖,所以文章介紹行鎖會以innodb引擎為例來介紹。二 全域性鎖 mysql 提供全域性鎖來對整個資料庫例項加鎖。語法 flush tables with read...
微服務架構必須要懂的概念
微服務架構必須要懂的概念 最近專案需要把自己負責的專案逐步改造成微服務,對專案逐步改造,慢慢的有個很有趣的想法,專案就是乙個公司。小王最近打算開始創業了,初期業務比較少,就招了小李乙個業務員來處理業務。李就是單體服務 這樣小李有事請假了,就沒有人來處理業務了。這樣不行啊嚴重影響公司的業務的開展,小王...
對於MySQL你必須要了解的鎖知識
mysql 的鎖按照範圍可以分為全域性鎖 表鎖 行鎖,其中行鎖是由資料庫引擎實現的,並不是所有的引擎都提供行鎖,myisam 就不支援行鎖,所以文章介紹行鎖會以innodb引擎為例來介紹行鎖。mysql 提供全域性鎖來對整個資料庫例項加鎖。語法 flush tables with read lock...