C 實現二叉查詢樹

2022-03-28 03:01:58 字數 3808 閱讀 7607

樹是一種非線性結構。樹的本質是將一些節點由邊連線起來,形成層級的結構。而二叉樹是一種特殊的樹,使得樹每個子節點必須小於等於2.而二叉查詢樹又是一類特殊的二叉樹。使得每乙個節點的左節點或左子樹的所有節點必須小於這個節點,右節點必須大於這個節點。從而方便高效搜尋。

下面來看如何使用c#實現二叉查詢樹。

二叉查詢樹是節點的集合。因此首先要構建節點,如**1所示。

//二叉查詢樹的節點定義

public

class node

}

**1.節點的定義

構建二叉樹是通過向二叉樹插入元素得以實現的,所有小於根節點的節點插入根節點的左子樹,大於根節點的,插入右子樹。依此類推進行遞迴。直到找到位置進行插入。二叉查詢樹的構建過程其實就是節點的插入過程。c#實現**如**2所示。

public

void insert(int data)

//否則找到合適葉子節點位置插入

else

}else}}

}}

**2.實現二叉樹的插入

二叉樹的遍歷分為先序(preorder),中序(inorder)和後序(postorder)。先序首先遍歷根節點,然後是左子樹,然後是右子樹。中序首先遍歷左子樹,然後是根節點,最後是右子樹。而後續首先遍歷左子樹,然後是右子樹,最後是根節點。因此,我們可以通過c#遞迴來實現這三種遍歷,如**3所示。

//中序

public

void inorder(node theroot)

}//先序

public

void preorder(node theroot)

}//後序

public

void postorder(node theroot)

}

**3.實現二叉排序樹的先序,中序和後續遍歷

二叉查詢樹因為已經有序,所以查詢最大值和最小值非常簡單,找最小值只需要找最左邊的葉子節點即可。而找最大值也僅需要找最右邊的葉子節點,如**4所示。

//找到最大節點

public

void findmax()

console.writeline("\n最大節點為:" + current.data);

}//找到最小節點

public

void findmin()

console.writeline("\n最小節點為:" + current.data);

}

**4.二叉查詢樹找最小和最大節點

因為二叉查詢樹已經有序,所以查詢時只需要從根節點開始比較,如果小於根節點,則查左子樹,如果大於根節點,則查右子樹。如此遞迴,如**5所示。

//查詢

public node search(int i)

else

if (i > current.data)

else

}if (current.data != i)

return current;

}

**5.二叉查詢樹的查詢

二叉樹的刪除是最麻煩的,需要考慮四種情況:

我們首先需要找到被刪除的節點和其父節點,然後根據上述四種情況分別處理。如果遇到被刪除元素是根節點時,還需要特殊處理。如**6所示。

//刪除二叉查詢樹中的節點,最麻煩的操作

public node delete(int key)

else

if (key > current.data)

//找到被刪除節點,跳出迴圈

else

}//找到被刪除節點後,分四種情況進行處理

//情況一,所刪節點是葉子節點時,直接刪除即可

if (current.left == null && current.right == null)

else

if (current.data < parent.data)

parent.left = null;

else

parent.right = null;

}//情況二,所刪節點只有左孩子節點時

else

if(current.left!=null&¤t.right==null)

//情況三,所刪節點只有右孩子節點時

else

if (current.left == null && current.right != null)

//情況四,所刪節點有左右兩個孩子

else

temp.right = current.right;

}//右孩子

else

if (current.data > parent.data)

temp.right = current.right;

}//當被刪節點是根節點,並且有兩個孩子時

else

temp.right = rootnode.right;

rootnode = current.left;}}

return current;

}

**6.二叉查詢樹的刪除

現在我們已經完成了二叉查詢樹所需的各個功能,下面我們來對**進行測試:

binarysearchtree b = new binarysearchtree();

/*插入節點*/

b.insert(5);

b.insert(7);

b.insert(1);

b.insert(12);

b.insert(32);

b.insert(15);

b.insert(22);

b.insert(2);

b.insert(6);

b.insert(24);

b.insert(17);

b.insert(14);

/*插入結束 */

/*對二叉查詢樹分別進行中序,先序,後序遍歷*/

console.write("\n中序遍歷為:");

b.inorder(b.rootnode);

console.write("\n先序遍歷為:");

b.preorder(b.rootnode);

console.write("\n後序遍歷為:");

b.postorder(b.rootnode);

console.writeline("");

/*遍歷結束*/

/*查最大值和最小值*/

b.findmax();

b.findmin();

/*查詢結束*/

/*搜尋節點*/

node x = b.search(15);

console.writeline("\n所查詢的節點為" + x.data);

/*搜尋結束*/

/*測試刪除*/

b.delete(24);

console.write("\n刪除節點後先序遍歷的結果是:");

b.inorder(b.rootnode);

b.delete(5);

console.write("\n刪除根節點後先序遍歷的結果是:");

b.inorder(b.rootnode);

console.readkey();

/*刪除結束*/

**7.測試二叉查詢樹

執行結果如圖1所示:

圖1.測試執行結果

樹是節點的層級集合,而二叉樹又是將每個節點的孩子限制為小於等於2的特殊樹,二叉查詢樹又是一種特殊的二叉樹。二叉樹對於查詢來說是非常高效,尤其是查詢最大值和最小值。

二叉查詢樹,實現

public class binarytree 移除乙個節點 分三種情況,乙個是 該節點本身是葉子,乙個是 該節點含有乙個兒子節點 乙個是 該節點還有兩個兒子節點 param e param comareelement private binarynoderemove element e,binar...

二叉查詢樹的實現C

struct node class bstelse else 插入到root的左子樹 else return root node else node insert2tree node root node,int val 刪除節點base,並返回根節點 node deletenode node con...

二叉查詢樹 C

include stdafx.h include using namespace std 二叉查詢樹的性質 1.二叉排序樹或為空樹 2.若左子樹不為空,則左子樹中所有節點的值均小於或等於根節點 3.若右子樹不為空,則右子樹中所有節點的值均大於或等於跟節點 4.左右子樹也為二叉排序樹 5.二叉排序樹採...