二叉搜尋樹的簡介:
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 解釋 輸入為 ...