#include #include#include
#include
using
namespace
std;
//二分搜尋樹
template class
bst node(node *node)
};node *root; //
根節點int count; //
樹中的節點個數
public
:
//建構函式, 預設構造一棵空二分搜尋樹
bst()
//析構函式, 釋放二分搜尋樹的所有空間
~bst()
//返回二分搜尋樹的節點個數
intsize()
//返回二分搜尋樹是否為空
bool
isempty()
//向二分搜尋樹中插入乙個新的(key, value)資料對
void
insert(key key, value value)
//檢視二分搜尋樹中是否存在鍵key
bool
contain(key key)
//在二分搜尋樹中搜尋鍵key所對應的值。如果這個值不存在, 則返回null
value*search(key key)
//二分搜尋樹的前序遍歷
void
preorder()
//二分搜尋樹的中序遍歷
void
inorder()
//二分搜尋樹的後序遍歷
void
postorder()
//二分搜尋樹的層序遍歷
void
levelorder()
}//尋找二分搜尋樹的最小的鍵值
key minimum()
//尋找二分搜尋樹的最大的鍵值
key maximum()
//從二分搜尋樹中刪除最小值所在節點
void
removemin()
//從二分搜尋樹中刪除最大值所在節點
void
removemax()
//從二分搜尋樹中刪除鍵值為key的節點
void
remove(key key)
private
:
//向以node為根的二分搜尋樹中, 插入節點(key, value), 使用遞迴演算法
//返回插入新節點後的二分搜尋樹的根
node* insert(node *node, key key, value value)
if( key == node->key )
node->value =value;
else
if( key < node->key )
node->left = insert( node->left , key, value);
else
//key > node->key
node->right = insert( node->right, key, value);
return
node;
}void insert_non_recursive (node *node, key key, value value)
node *x =node;
node *y =null;
while(x !=null)
else
if(key < x->key)
else
}if(y)
else
}return
; }
//檢視以node為根的二分搜尋樹中是否包含鍵值為key的節點, 使用遞迴演算法
bool contain(node*node, key key)
//在以node為根的二分搜尋樹中查詢key所對應的value, 遞迴演算法
//若value不存在, 則返回null
value* search(node*node, key key)
//對以node為根的二分搜尋樹進行前序遍歷, 遞迴演算法
void preorder(node*node)
else
}//對以node為根的二分搜尋樹進行中序遍歷, 遞迴演算法
void inorder(node*node)
}//對以node為根的二分搜尋樹進行後序遍歷, 遞迴演算法
void postorder(node*node)
}//釋放以node為根的二分搜尋樹的所有節點
//採用後續遍歷的遞迴演算法
void destroy(node*node)
}//返回以node為根的二分搜尋樹的最小鍵值所在的節點, 遞迴演算法
node* minimum(node*node)
//返回以node為根的二分搜尋樹的最大鍵值所在的節點, 遞迴演算法
node* maximum(node*node)
//刪除掉以node為根的二分搜尋樹中的最小節點, 遞迴演算法
//返回刪除節點後新的二分搜尋樹的根
node* removemin(node*node)
node->left = removemin(node->left);
return
node;
}//刪除掉以node為根的二分搜尋樹中的最大節點, 遞迴演算法
//返回刪除節點後新的二分搜尋樹的根
node* removemax(node*node)
node->right = removemax(node->right);
return
node;
}//刪除掉以node為根的二分搜尋樹中鍵值為key的節點, 遞迴演算法
//返回刪除節點後新的二分搜尋樹的根
node* remove(node*node, key key)
else
if( key > node->key )
else
//待刪除節點右子樹為空的情況
if( node->right ==null )
//待刪除節點左右子樹均不為空的情況
//找到比待刪除節點大的最小節點, 即待刪除節點右子樹的最小節點
//用這個節點頂替待刪除節點的位置
node *successor = new node(minimum(node->right));
count ++;
successor->right = removemin(node->right);
successor->left = node->left;
delete
node;
count --;
return
successor;}}
};void shuffle( int arr, int
n )}
//測試 remove
intmain()
//注意, 由於隨機生成的資料有重複, 所以bst中的資料數量大概率是小於n的
//order陣列中存放[0...n)的所有元素
intorder[n];
for( int i = 0 ; i < n ; i ++)
order[i] =i;
//打亂order陣列的順序
shuffle( order , n );
//亂序刪除[0...n)範圍裡的所有元素
for( int i = 0 ; i < n ; i ++)
if( bst.contain( order[i] ))
//最終整個二分搜尋樹應該為空
cout << bst.size()
}
二叉搜尋樹 二叉搜尋樹
題目 二叉搜尋樹 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 解釋 輸入為 ...