了解集合本質必須要知曉的概念04 二叉查詢樹

2022-01-19 02:13:27 字數 4414 閱讀 8583

與鍊錶、堆疊和佇列不一樣,二叉查詢樹不是線性資料結構,是二維資料結構。每個節點都包含乙個leftnode和rightnode,二叉查詢樹把比節點資料項小的資料放在leftnode,把比節點資料項大的資料放在rightnode。

關於節點的類。

public

class treenode

public treenodeleftnode
public treenoderightnode
public treenode(t element)
public

override

string tostring()

if (this.leftnode != null)
if (this.rightnode != null)
nodestring += "]";
return nodestring;
}
}
以上,把比節點資料項element小的資料所在節點賦值給leftnode,把比節點資料項element大的資料所在節點賦值給rightnode。

建立乙個泛型二叉樹查詢類,維護著乙個根節點,並提供各種對節點的操作方法。

public

class binarysearchtree

public binarysearchtree()
//把某個資料項插入到二叉樹
public

void insert(t x)

//把某個資料項從二叉樹中刪除
public

void remove(t x)

//刪除二叉樹中的最小資料項
public

void removemin()

//獲取二叉樹中的最小資料項
public t findmin()
//獲取二叉樹中的最大資料項
public t findmax()
//獲取二叉樹中的某個資料項
public t find(t x)
//清空
public

void makeempty()

//判斷二叉樹是否為空,是否存在
public

bool isempty()

//獲取某個節點的資料項
private t elemntat(treenodet)
///
/// 查詢節點
/// 

/// 要查詢資料項

/// 已存在的節點

/// 返回節點

private treenodefind(t x, treenodet)
else

if ((x as icomparable).compareto(t.element) > 0)

else

//如果找到資料項,就返回當前t的值

}
return

null;

}
//獲取最小的節點,
private treenodefindmin(treenodet)
}
return t;
}
//獲取最大的節點
private treenodefindmax(treenodet)
}
return t;
}
///
/// 插入節點
/// 

/// 要插入的資料項

/// 已經存在的節點

/// 返回已存在的節點

protected treenodeinsert(t x, treenodet)
else

if ((x as icomparable).compareto(t.element) < 0)

else

if ((x as icomparable).compareto(t.element) > 0)

else
return t;
}
//刪除最小的節點
//返回當前根節點
protected treenoderemovemin(treenodet)
else

if (t.leftnode != null)

else

//當t.leftnode=null的時候,就把t.rightnode當作最小節點返回

}
//刪除某資料項,返回當前根節點
protected treenoderemove(t x, treenodet)
else

if((x as icomparable).compareto(t.element) < 0)

else

if ((x as icomparable).compareto(t.element) > 0)

else

if (t.leftnode != null && t.rightnode != null)

else
return t;
}
public

override

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...