一、二叉搜尋樹的概念:
1.二叉搜尋樹又稱二叉排序樹,它或者是一棵空樹,或者是具有以下性質的二叉樹:
(1)若它的左子樹不為空,則左子樹上所有節點的值都小於根節點的值
(2)若它的右子樹不為空,則右子樹上所有節點的值都大於根節點的值
(3)它的左右子樹也分別為二叉搜尋樹
給定值的比較次數等於給定值節點在二叉排序樹中的層數。如果二叉排序樹是平衡的,則n個節點的二叉排序樹的高度為log2n+1,其查詢效率為o(log2n),近似於折半查詢。如果二叉排序樹完全不平衡,則其深度可達到n,查詢效率為o(n),退化為順序查詢。一般的,二叉排序樹的查詢效能在o(log2n)到o(n)之間。因此,為了獲得較好的查詢效能,就要構造一棵平衡的二叉排序樹。
二、二叉搜尋樹的基本操作:
1.查詢
(1)如果 key == root->key ,表示已找到;
(2)如果 key < root->key,去左子樹中找;
(3)如果 key > root->key,去右子樹中找;
2.插入
(1)進行查詢,如果找到,插入失敗;
(2)如果root == null,在這個位置插入 key,需要修改雙親節點的 left 或者 right;
(3)如果對空樹做插入需要特殊處理;
3.刪除
若找到:
(1)三種 cur->left == null情況;
(2)三種 cur->right == null情況;
(3)左右子樹均不為空,這裡選右子樹替換刪除;
若未找到:
則刪除失敗。
bstreenode.h
#pragma once
#include
#include
#include
typedef
int key;
typedef
struct bstreenode
bstreenode;
intbstreesearch
(bstreenode *root,key key)
;//遞迴實現查詢
intbstreesearchnor
(bstreenode *root,key key)
;//非遞迴實現查詢
intbstreeinsert
(bstreenode *root,key key)
;//遞迴實現插入
intbstreeinsertnor
(bstreenode *root,key key)
;//非遞迴實現插入
intbstreeremove
(bstreenode *root,key key)
;//非遞迴實現刪除
bstreesearch.c
int
bstreesearch
(bstreenode *root,key key)
if(key == root-
>key)
if(key
>key)
return
bstreesearch
(root-
>right,key);}
intbstreesearchnor
(bstreenode *root,key key)
while
(cur)
if(key
>key)
if(key>cur-
>key)
}return-1
;}intbstreeinsert
(bstreenode *
*root,key key)
if(key ==
(*root)
->key)
if(key<
(*root)
->key)
else
}int
bstreeinsertnor
(bstreenode *
*root,key key)
parent = cur;
if(key
>key)
else
} bstreenode *node =
(bstreenode*
)malloc
(sizeof
(bstreenode));
node-
>key = key;
node-
>left =
null
; node-
>right =
null;if
(parent ==
null
)else
if(key
>key)
else
return0;
}int
bstreeremove
(bstreenode *
*root, key key)
else
if(key
>key)
else
}//右孩子為空的三種情況if(
null
== cur-
>right)
else
if(key
>key)
else
}else
cur-
>key = del-
>key;
if(delparent == cur)
else}}
parent = cur;
if(key
>key)
else
}return-1
;}
二叉搜尋樹 二叉搜尋樹的刪除操作
如圖刪除 7,4,2直接刪除接可以 如圖 刪除6把7拉上去 如圖 刪除3 4沒有左孩子直接返回4 所以最後的結果只是4覆蓋3 上 class solution if key root.val else if key root.val else else if root.right null else...
二叉搜尋樹 二叉搜尋樹
題目 二叉搜尋樹 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 ...