將小的數放到左兒子上,將大的數放到右兒子上,於是建樹成功後,最左邊的是最小的,最右邊的是最大。中序遍歷將會得到從小到大的排序順序。這篇部落格會介紹二叉搜尋樹的插入和刪除,還有為了方便演示,會介紹到中序遞迴遍歷。
給定陣列
8,5,20,3,6,15,7,得到的二叉搜尋樹為:
中序遍歷的結果:3,5,6,7,8,15,20,剛好是從小到大排序的。
class bstnode
};class bstree
2、插入函式insert:將小的數值插入到左兒子上,大的數值插入到右兒子上,於是採取遞迴操作。
void bstree::insert(bstnode * &t, int key)
為了在實際中(我為了中序遍歷書寫簡單些,將*root設為了共有變數)不訪問根節點*root,所以需要再加入乙個函式:
/*插入演算法*/
void bstree::insert(int key)
3、刪除函式delete:刪除分為三種情況
第一種:沒有兒子:比如刪除7所在節點的時候,直接找到這個節點刪除
第二種:只有乙個兒子:比如刪除20的時候,直接將它的不為空的兒子取代當前結點:
新的搜尋樹:
第三種:左右兒子都不為空:比如刪除數值為5的節點,此時找到以該節點為樹根的樹的最右邊的節點,可以發現是7。將找到的節點和原節點替換(就是將5和7替換),刪掉原來的節點。
刪除5後的圖:
**如下:
/*找到需要刪除數值所在的節點*/
bstnode *&bstree::find_equal(bstnode *&t, int key)
if (key < t->val)
find_equal(t->left, key);
else if (key > t->val)
find_equal(t->right, key);
else
return t;
void bstree::bstdelete(int key)
if (y == t) //y與t重合的情況
y->right = x->right;
else
y->left = x->left;
p = x;
x->left = t->left;
x->right = t->right;
}else
delete t;}}
// bstree.cpp : 此檔案包含 "main" 函式。程式執行將在此處開始並結束。
//#include #includeusing namespace std;
class bstnode
};class bstree
;bstree::bstree()
void bstree::insert(bstnode * &t, int key)
/*插入演算法*/
void bstree::insert(int key)
void bstree::inorder(bstnode *t)
}/*找到需要刪除數值所在的節點*/
bstnode *&bstree::find_equal(bstnode *&t, int key)
if (key < t->val)
find_equal(t->left, key);
else if (key > t->val)
find_equal(t->right, key);
else
return t;
}void bstree::bstdelete(int key)
if (y == t) //y與t重合的情況
y->right = x->right;
else
y->left = x->left;
p = x;
x->left = t->left;
x->right = t->right;
} else
delete t; }}
int main()
if (count == 2)
cout << "\n搜尋樹中序遍歷結果:" << endl;
cout << "" << endl;
cout << "1、新增樹 2、輸入要刪除的數字 3、退出" << endl;
cin >> count;
} cout << "退出!" << endl;
return 0;
}
二叉搜尋樹 二叉搜尋樹
題目 二叉搜尋樹 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 解釋 輸入為 ...