二叉搜尋樹

2022-08-05 17:48:17 字數 3001 閱讀 7428

二叉搜尋樹的簡介:

o(log(n)),在最壞的情況下,二叉搜尋樹會退化為乙個鍊錶。為了解決這個問題呢,人們又提出了平衡搜尋樹;

二叉搜尋樹的性質:

1. 每個節點都有乙個作為搜尋依據的關鍵碼(key),所有節點的關鍵碼互不相同。

2. 左子樹上所有節點的關鍵碼(key)都小於根節點的關鍵碼(key)。

3. 右子樹上所有節點的關鍵碼(key)都大於根節點的關鍵碼(key)。

4. 左右子樹都是二叉搜尋樹。

如圖:

/*節點結構*/

template

struct

node

k key;

node

*left;

node

*right;

};

/*平衡搜尋樹類*/

template

class

searchbinarytree

bool creat(node*&root, k key); //遞迴建立

bool creat_nor(node*&root, k key); //非遞迴建立

bool delete(node*root, k key); //刪除某一節點

node

* find(node*root, k key); //查詢某一節點

node

* find_nor(node*root, k key); //非遞迴查詢某一節點

void inorder(node*root); //中序遍歷

public

: node

*_root;

};

/*相關函式的實現*/

template

bool searchbinarytree::creat(node*&root,k key)

if (key > root->key)

return creat(root->right, key);

else

if (key < root->key)

return creat(root->left, key);

else

return

false

;

}template

bool searchbinarytree::creat_nor(node*&root, k key)

node

* prev =null;

node

* cur =root;

while

(cur)

else

if (key < cur->key)

else

return

false

; }

if (prev->key

else

return

true;}

template

bool searchbinarytree::delete(node*root, k key)

node

* prev =null;

while

(root)

else

if (key < root->key)

else

//找的了相應的節點需要刪除了

else

if (root->key > prev->key)

else

delete

root;

}else

if (root->right == null) //

右為空

else

if (root->key > prev->key)

else

} else

//兩邊都不為空

node

* tmp = root->right;

prev = root; //

root 的右子樹的最左節點就是 root->right,保證prev始終是tmp的父親節點

當左孩子,右孩子都不為空時,為什麼要將右子樹的最左孩子與root交換呢,原因是:交換之後能夠保證 root->left->key < root->key && root->right->key > root->key  

從而使得這個搜尋二叉樹依然有序

template

node

* searchbinarytree::find(node*root, k key)

if (key > root->key)

else

if (key < root->key)

else

}template

node

* searchbinarytree::find_nor(node*root, k key)

while

(root)

return

null;

}template

void searchbinarytree::inorder(node*root)

inorder(root->left);

cout

<< root->key << "";

inorder(root->right);

}

二叉搜尋樹 二叉搜尋樹

題目 二叉搜尋樹 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 解釋 輸入為 ...