二叉搜尋樹

2022-02-03 10:14:40 字數 3806 閱讀 9936

#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 解釋 輸入為 ...