二叉搜尋樹(binary search tree),(又:二叉查詢樹,二叉排序樹)它或者是一棵空樹,或者是具有下列性質的二叉樹:
1.若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;
2.若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;
3.它的左、右子樹也分別為二叉排序樹。
struct bst_node
};
二叉搜尋樹的操作`
1.二叉搜尋樹的查詢
若根節點不為空:
如果根節點key==查詢key 返回true
如果根節點key>查詢key 在其左子樹查詢
如果根節點key《查詢key 在其右子樹查詢
否則 返回false
bst_node* searchbst(bst_node *root, int val)
else if (root->val > val)
else
}return root;
}
2.二叉搜尋樹的插入
若樹為空,則直接插入 然後返回true
若樹不空,按二叉搜尋樹性質查詢插入位置,插入新節點
bst_node* insertbst(bst_node *root, int val)
if (root->val < val)
else if (root->val > val)
return nullptr;
}
3.二叉搜尋樹的刪除
首先查詢元素是否在二叉搜尋樹中,如果不存在,則返回, 否則要刪除的結點可能分下面四種情況:
要刪除的結點無孩子結點
要刪除的結點只有左孩子結點
要刪除的結點只有右孩子結點
要刪除的結點有左、右孩子結點
看起來有待刪除節點有4種情況,實際情況1可以與情況2或者3合併起來,因此真正的刪除過程如下:
情況2:刪除該結點且使被刪除節點的雙親結點指向被刪除節點的左孩子結點
情況3:刪除該結點且使被刪除節點的雙親結點指向被刪除結點的右孩子結點
情況4:在它的右子樹中尋找中序下的第乙個結點(關鍵碼最小),用它的值填補到被刪除節點中,再來處理該結點的刪除問題
void deletebst_node(bst_node *root, int val)
bst_node *parent = nullptr, *cur = root;
while (cur != nullptr)
else if (cur->val > val)
else
else if (cur->left != nullptr && cur->right != nullptr) //左右子樹都不為空
cur->val = del->val;
if (del == cur->right)
else
delete del;
}else //左右子樹其中乙個為空
else
}else
else
}delete cur;
}break;}}
}
二叉搜尋樹的插入,查詢,刪除
include using namespace std template class node 預設析構函式 templatenode node template node node t value template class bstree 預設析構 void buildbstree 建立二叉樹 ...
二叉搜尋樹的查詢 插入 刪除
coding utf 8 time 2020 9 23 15 56 author julyli file bst.py class bitreenode def init self,data self.data data self.lchild none self.rchild none self....
二叉搜尋樹的插入 刪除 查詢
1 若左子樹不空,則左子樹上所有節點的值均小於它的根節點的值 2 若右子樹不空,則右子樹上所有節點的值均大於它的根節點的值 3 左 右子樹也分別為二叉排序樹 4 沒有鍵值相等的節點 插入的資料之後要滿足二叉樹的性質1和2,所以要先找到插入位置,且插入的位置一定是在葉子節點的下面 所以插入分兩個步驟 ...