c 二叉搜尋樹 基本操作

2021-09-26 06:03:57 字數 2865 閱讀 7215

前面我們寫過二叉樹, 兩種樹基本是相同的結構, 但是二叉搜尋樹又有固定的一些條件, 下來我們一起看.

二叉搜尋樹又稱二叉排序樹, 它有兩種可能

1. 空樹

2. 非空樹, 滿足 : 

a. 若左子樹不為空, 則左子樹上所有的點都小與根節點

b. 若右子樹不為空, 則右子樹上所有的點都大於根節點

c. 它的左右子樹也分別為二叉搜尋樹

1. 查詢 find

a. 若根節點不為空

若根節點的data

若根節點的data >  查詢的data, 去左子樹找

若根節點的data =  查詢的data, 返回true

都沒有就返回false

b. 根節點為空, 直接返回false

2. 插入 insert

a. 如果是空樹, 直接插入

b. 不是空樹, 先找到合適的位置, 然後再進行插入

3. 刪除 erase

a. 要刪除的節點沒有孩子節點, 直接刪除.

b. 要刪除的節點只有右孩子, 讓該節點的雙親節點指向它的右孩子, 然後再進行刪除.

c. 要刪除的節點只有左孩子, 同上.

d. 要刪除的節點有左右孩子, 比較複雜,兩種思路

i : 找到中序下的前乙個節點, 即左孩子的最右孩子, 交換該節點與要刪除節點的值, 再刪除找到的節點.

ii : 找到中序下的後乙個節點, 即右孩子的最左孩子, 同上.

舉例說明d :

//定義變數, 不要直接用_root

pnode cur = _root;

while (cur)

else if (cur->_data > data)

else

}return false;

} bool insert(const t& data)

//有關係, 所以要用兩個指標

pnode parent = nullptr;

pnode cur = _root;

//一直找到合適的位置

while (cur)

else if (cur->_data > data)

else

}//插入新的節點

cur = new node(data);

if (parent->_data > data)

else

return true;

} bool erase(const t& data)

// 查詢在data在樹中的位置

pnode cur = _root;

pnode parent = nullptr;

while (cur)

parent = cur;

if (cur->_data > data)

else

}// data不在二叉搜尋樹中,無法刪除

if (cur == nullptr)

//data在樹中,分情況討論

if (cur->_left == nullptr && cur->_right == nullptr)

else

delete cur;

cur = nullptr;

} else if (cur->_right == nullptr)

else

parent->_right = cur->_left;

}else

delete cur;

cur = nullptr;

} else if (cur->_left == nullptr)

else

parent->_right = cur->_right;

}else

_root = cur->_right;

delete cur;

cur = nullptr;

} else

//交換值

cur->_data = next->_data;

//鏈結

if (parent->_left == next)

parent->_left = next->_left;

else

parent->_right = next->_left;

//刪除cur

delete next;

next = nullptr;

} return true;

} void inorder()

void _inorder(pnode root)

void _destroy(pnode& root)

private:

pnode _root = nullptr;

};void test()

int main()

以上就是二叉搜尋樹以及一些基本的操作, 謝謝**^_^

二叉搜尋樹的基本操作

建立乙個非負二叉搜尋樹 1表空結點 編寫查詢函式,層序遍歷函式,插入函式,刪除函式,查詢最大值最小值函式 輸入該樹和要查詢的值 輸出 如果找到,列印出 x is found 沒找到列印出 not found 列印出層序遍歷序列 刪除最大值和最小值 刪除成功輸出 x is delete 最後再進行一層...

二叉搜尋樹的基本操作

二叉搜尋樹 binary search tree 它或者是一棵空樹,或者是具有下列性質的二叉樹 若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值 它的左 右子樹也分別為二叉搜尋樹樹。節點設定 typedef int datat...

二叉搜尋樹的基本操作

pragma once typedef int datatype typedef struct bstreenode bstnode include include include bstnode buybstreenode datatype data pnewnode data data pnew...