二叉搜尋樹–採用三叉鏈結構–也就是左右孩子和母親
二叉搜尋樹又稱二叉排序樹它或者是一棵空樹或者有以下特點
(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 解釋 輸入為 ...