二叉搜尋樹BST

2021-07-09 04:48:48 字數 3514 閱讀 7745

在二叉搜尋樹b中查詢x的過程為:

1.若b是空樹,則搜尋失敗,否則:

2.若x等於b的根結點的資料域之值,則查詢成功;否則

3.若x小於b的根結點的資料域之值,則搜尋左子樹:否則

4.查詢右子樹

// 指標parent指向proot的父節點,其初始呼叫值為null

// 若查詢成功,指標ptarget指向目標節點,函式返回true

// 否則指標ptarget指向查詢路徑上訪問的最後乙個節點,函式返回false

// ptarget初始值為null,由於函式呼叫過程中需要修改其指標值,所以引數傳遞雙層指標

bool searchbst(binarytreenode* proot, int key, binarytreenode* parent, binarytreenode** ptarget)

if(proot->value == key)

else if(proot->value > key)

return searchbst(proot->left, key, proot, ptarget);

else

return searchbst(proot->right, key, proot, ptarget);

}

向乙個二叉搜尋樹b中插入乙個節點s的演算法,過程為:

1.若b是空樹,則將s所指節點作為根節點插入,否則:

2.若s->value等於b的根節點的資料域之值,則返回,否則:

3.若s->value小於b的根節點的資料域之值,則把s所指節點插入到左子樹中,否則:

4.把s所指節點插入到右子樹中。(新插入節點總是葉子節點)

// 當樹為空時,需要修改根結點指標值,所以引數傳遞雙層指標

bool insertbst(binarytreenode** proot, int key)

else if((*proot)->value == key)

return false;

if((*proot)->value > key)

return insertbst(&(*proot)->left, key);

else

return insertbst(&(*proot)->right, key);

}

在二叉查詢樹中刪去乙個節點,分三種情況討論:

1.若*p節點為葉子節點,即pl(左子樹)和pr(右子樹)均為空樹。由於刪去葉子節點不破壞整棵樹的結構,則只需修改其雙親節點的指標即可。

2.若*p節點只有左子樹pl或右子樹pr,此時只要另pl或pr直接成為其雙親節點*f的左子樹(當*p是左子樹)或右子樹(當*p是右子樹)即可。

3.若*p節點的左子樹和右子樹均不空。在刪去*p之後,為保持其它元素之間的相對位置不變,可按中序遍歷保持有序進行調整,可以有兩種做法:其一是另*p的直接前驅(inorder predecessor)或直接後繼(inorder successor)替代*p,然後再從二叉查詢樹中刪去它的直接前驅(或直接後繼)

bool deletenode(binarytreenode** proot)

else if((*proot)->right == null)

else if((*proot)->left == null)

else

(*proot)->value = s->value;

if(q != *proot)

q->right = s->left;

else

q->left = s->left;

delete s;

} return true;

}bool deletebst(binarytreenode** proot, int key)

完整驗證**:

#include using namespace std;

struct binarytreenode

;// 指標parent指向proot的父節點,其初始呼叫值為null

// 若查詢成功,指標ptarget指向目標節點,函式返回true

// 否則指標ptarget指向查詢路徑上訪問的最後乙個節點,函式返回false

// ptarget初始值為null,由於函式呼叫過程中需要修改其指標值,所以引數傳遞雙層指標

bool searchbst(binarytreenode* proot, int key, binarytreenode* parent, binarytreenode** ptarget)

if(proot->value == key)

else if(proot->value > key)

return searchbst(proot->left, key, proot, ptarget);

else

return searchbst(proot->right, key, proot, ptarget);

}// 當樹為空時,需要修改根結點指標值,所以引數傳遞雙層指標

二叉搜尋樹(BST)

二叉搜尋樹 bst bst 或者是一棵空樹,或者對於任何乙個結點,設其值為k,則該結點的左子樹的值小於k,右結點的值大於k。二叉搜尋樹按照中根遍歷將各個結點列印,將得到按照大到小的順序排列。bsg示意圖 二叉搜尋樹的效率在於檢索,將演算法複雜度從2 k減少到log n 檢索方式 從根結點開始,如果等...

BST二叉搜尋樹

深入學習理解bst include using namespace std typedef struct bitnodebitnode,bitree 二叉樹的插入操作 void insert bitnode root,int x 因為當對空樹插入時,相當於改變了樹的根節點的指向,因此需要用到指標或引...

二叉搜尋樹 BST

也稱二叉查詢樹或二叉排序樹 非空二叉搜尋樹的性質 刪除 此操作相對其他操作更加複雜。可以分為三種情況 參考自浙大資料結構 include include include using namespace std typedef int elementtype 二叉搜尋樹 左子樹元素都比根元素小,右子樹...