重學資料結構系列之 二叉排序樹

2021-07-10 17:06:55 字數 2204 閱讀 2290

1.定義

對任意結點,如果左子樹不為空,則左子樹上所有結點的權值都小於該結點的權值;如果右子樹不為空,則右子樹上所有結點的權值都大於該結點的權值;任意結點的左子樹和右子樹都是一棵二叉排序樹;

前驅和後繼:結點的前驅就是指小於結點權值的結點中,權值最大的乙個結點;對應的,結點的後繼就是指大於結點權值的結點中,權值最小的乙個結點。

我要說:前驅簡單來說就是查詢左子樹中的最大值,後繼就是查詢右子樹中的最小值

這裡面的實現是以二叉樹為基礎的:

#includeusing namespace std;

class node

~node()

if (rchild != null)

}//插入函式

void insert(int value)else if (value > data) else

}elseelse

} }//查詢函式

node* search(int value)else if (value > data) else

}elseelse

} }//查詢前驅(簡單來說就是在左子樹找最大的)

node* predecessor()

//迴圈結束,temp就是我們要找的前驅

return temp;

} //查詢後繼(簡單來說就是在右子樹找最小的)

node* successor()

//迴圈結束,temp就是我們要找的後繼

return temp;

} //刪除結點(只刪除度為0或1的結點,度就是分支的數目),這個很方便地刪除前驅和後繼

void remove_node(node *delete_node)

//如果要刪除的結點的右孩子不為空

if (delete_node->rchild != null)

//如果delete_node是父親的左孩子,則更新temp為delete_node的父親的左孩子,否則就更新為右孩子

if (delete_node->father->lchild == delete_node) else

//最後刪除該結點

delete delete_node;

} //刪除二叉樹上value值的結點(原理是將孩子結點的值覆蓋value結點上的值)

bool delete_tree(int value)

//如果左孩子不為空,就找前驅(即用左孩子中最大的替換當前結點的value值,再刪除左孩子中最大的結點)

if (current_node->lchild != null) else if (current_node->rchild != null) else

//將要刪除的前驅或後繼的值覆蓋current_node的值

/*如果有左孩子沒有右孩子:delete_node是前驅

如果有右孩子,不管有沒有左孩子:delete_node是後繼

如果左右孩子都沒有:delete_node就是current_node

*/current_node->data = delete_node->data;

//刪除delete_node(這樣子的delete_node要麼就是1度,要麼就是0度)

remove_node(delete_node);

return true;

}};class binarytree

~binarytree()

}void insert(int value)else

} bool find(int value)else

} //刪除二叉樹上value值的結點

資料結構之二叉排序樹

二叉排序樹或者是一棵空樹,或者是具有下列性質的二叉樹 1 若左子樹不空,則左子樹上所有節點的值均小於它的根節點的值 2 若右子樹不空,則右子樹上所有節點的值均大於它的根節點的值 3 左 右子樹也分別為二叉排序樹 4 沒有鍵值相等的節點。以下只建立並先序列印出二叉排序樹 include include...

資料結構之二叉排序樹

二叉排序樹 bst binary sort search tree 對於二叉排序樹的任何乙個非葉子節點,要求左子節點的值比當前節點的值小,右子節點的值比當前節點的值大。特別說明 如果有相同的值,可以將該節點放在左子節點或右子節點 比如針對前面的資料 7,3,10,12,5,1,9 對應的二叉排序樹為...

資料結構之二叉排序樹

別名 二叉搜素樹,二叉查詢樹 線性結構的缺點 順序儲存 不排序 查詢困難,只能通過線性查詢乙個乙個找 排序 刪除和插入操作困難 鏈式結構 無論排序還是不排序,查詢都十分麻煩 注 二叉排序樹 bst 可以解決上述的問題 對於乙個二叉樹中的任意乙個非葉子節點,要求左子節點比當前節點小,右子節點比當前節點...