二叉搜尋樹

2021-09-26 02:08:48 字數 2751 閱讀 5289

二叉搜尋樹–採用三叉鏈結構–也就是左右孩子和母親

二叉搜尋樹又稱二叉排序樹它或者是一棵空樹或者有以下特點

(1)若它的左子樹不為空,則左子樹上所有節點的值都小於根節點的值

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

它的左右子樹也分別為二叉搜素樹

首先是二叉樹的插入

(1)插入先建立遍歷方式

(1.1)分兩種情況一種在左邊小於根一種在右邊大於根

(2)插入資料

(2.1)建立新結點

(2.2)父母結點比他大大則朝左邊走,左邊的都小於父母反之右邊

(3)查詢—同遍歷

(4)移除

先找到後移除

分兩種情況

(4.1)刪除1個或者沒有孩子的情況

刪除乙個孩子:

(4.1.1)左孩子為空cur->leftnull

左邊樹 parent左邊cur的右邊存在

右邊樹 parent右邊cur右邊存在

特殊情況 沒有parent則cur為根 _root=cur->_right;

(4,1,2)刪除乙個孩子:右為空cur->rigtnull

左邊樹 parent左邊cur的左邊存在

右邊樹 parent右邊cur的左邊存在

特殊情況處理 沒有parent則cur為根 _root=cur->_left;

(4.2)刪除2個孩子的情況

(4.21)刪除的是根

替換的結點是右子樹的最左結點

4.2.2不是根

當前節點左右孩子都存在,直接刪除不好刪除,可以在其子樹中找乙個替代結點

找其左子樹中的最大節點,即左子樹中最右側的節點,或者在其右子樹中最小的節點,即右子樹中最小的節點

替代節點找到後,將替代節點中的值交給待刪除節點,轉換成刪除替代節點

**實現

#include

2 //二叉搜尋樹實現

3 //二叉搜尋樹,左邊的一定比根小右邊的一定比根大

4 using namespace std;

5 template

6 struct bstreenode

11 };

12 template

13 struct bstree

17 bool insert(const pair&kv)

22 nodecur=_root;

23 node parent=nullptr;

24 while(cur)

32 else if(cur->_kv.first_right;

35 }

36 else

39 }

40 //建立遍歷方式後插入資料

cur=new node(kv);

42 if(parent->_kv.first>kv.first)

46 else

49 return true;

50 }

51 //node* find(const k&key)

56 nodecur=_root;

57 while(cur)

62 else if(cur->_kv.first_right;

65 }

66 else

69 }

70 //都找完了沒有找到則返回空

71 return nullptr;

72 }

73 bool remove(const k &key)

84 else if(cur->_kv.first_right=key;

87 }

88 else

else

105 else

108 }

109 }

110 else if(cur->_rightnullptr)

116 //parent不為空

117 else

else

124 }

125 }

126 else

134 cur->_kv=replace1->_kv;

135 del=replace1;

136 if(rpparent->_leftreplace1)

139 else

142 }

143 delete del;

144 return true;

145 }

146 }

147 return false;

148 }

149 void inorder()

157 _inorder(root->_left);

158 cout<_kv.first>

159 _inorder(root->_right);

160 }

private:

162 node _root;

163 };

二叉搜尋樹 二叉搜尋樹

題目 二叉搜尋樹 time limit 2000 1000 ms j a others memory limit 32768 32768 k j a others total submission s 6945 accepted submission s 3077 problem descripti...

二叉搜尋樹 修剪二叉搜尋樹

第一反應是重構,看來別人的解答發現,其實不用重構那麼複雜。treenode trimbst treenode root,int low,int high if root val high 下一層處理完左子樹的結果賦給root left,處理完右子樹的結果賦給root right。root left ...

樹 二叉樹 二叉搜尋樹

給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。假設乙個二叉搜尋樹具有如下特徵 節點的左子樹只包含小於當前節點的數。節點的右子樹只包含大於當前節點的數。所有左子樹和右子樹自身必須也是二叉搜尋樹。示例 1 輸入 2 13輸出 true 示例 2 輸入 5 14 3 6輸出 false 解釋 輸入為 ...