一.概念
最優情況下,二叉搜尋樹為完全二叉樹,其平均比較次數為log2n,最差情況下二叉搜尋樹退化為為單邊樹,其平均比較次數為n/2。二叉搜尋樹又稱二叉排序樹,它可以是一棵空樹,也可以是具有下面一些性質的數
1.若左子樹不為空,則左子樹上的所有節點的值都小於根節點的值。
2.若右子數不為空,則右子樹上的所有節點的值都大於根節點的值。
3.左右子樹也分別為二叉搜尋樹。
二.二叉搜尋樹的查詢
若不為空,則判斷你所要查詢的值和根節點的值的大小關係。若大於根節點的值,則從右子樹開始查詢,若小於根節點的值,則從左子樹開始查詢
若為空,則返回。
pnode find
(const t &value)
else
if(cur->value > value)
else
}return cur;
}
三.二叉搜尋樹的插入
若為空,則直接插入
否則,先紮到合適的位置(滿足二叉搜尋樹的規則),然後開闢空間,然後插入
bool insert
(const t &value)
//:先搜尋
pnode cur = root;
pnode parent = nullptr;
while
(cur)
else
if(cur->value > value)
else
} cur = new node
(value)
;//:判斷節點位置
if(parent->value > value)
else
return true;
}
四.二叉搜尋樹的刪除
bool erase
(const t &value)
pnode cur = root;
pnode parent = nullptr;
while
(cur)
else
}//:判斷節點是否存在
if(cur == nullptr)
return false;
//:若為單邊樹
//:此節點沒有左孩子
if(cur->left == nullptr)
為葉子節點,2.只有右子數的非葉子節點
//:更新根節點
else
root = cur->right;
delete cur;
cur = nullptr;
}else
if(cur->right == nullptr)
else
parent->right = cur->left;
}else
root = cur->left;
delete cur;
cur = nullptr;
}//:若不是單邊樹,如果刪除的不是葉子節點,則應該找到他的左孩子的右孩子或者右孩子的左孩子,然後交換位置,再進行刪除
else
cur->value = next->value;
if(parent->left == next)
parent->left = next->left;
else
parent->right = next->left;
delete next;
next = nullptr;
}return true;
}
五,完整**
#define _crt_secure_no_warnings 1
#include
using namespace std;
template
struct bsnode};
template
class bstree
else
if(cur->value > value)
else
}return cur;
} bool insert
(const t &value)
//:先搜尋
pnode cur = root;
pnode parent = nullptr;
while
(cur)
else
if(cur->value > value)
else
} cur = new node
(value)
;//:判斷節點位置
if(parent->value > value)
else
return true;
} bool erase
(const t &value)
pnode cur = root;
pnode parent = nullptr;
while
(cur)
else
}//:判斷節點是否存在
if(cur == nullptr)
return false;
//:此節點沒有左孩子
if(cur->left == nullptr)
為葉子節點,2.只有右子數的非葉子節點
//:更新根節點
else
root = cur->right;
delete cur;
cur = nullptr;
}else
if(cur->right == nullptr)
else
parent->right = cur->left;
}else
root = cur->left;
delete cur;
cur = nullptr;
}else
cur->value = next->value;
if(parent->left == next)
parent->left = next->left;
else
parent->right = next->left;
delete next;
next = nullptr;
}return true;
}void
inorder
(pnode root)
}void
test1()
private:
pnode root = nullptr;};
void
test()
intmain()
二叉搜尋樹 二叉搜尋樹
題目 二叉搜尋樹 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 解釋 輸入為 ...