二叉搜尋樹的操作

2021-08-31 16:42:10 字數 3115 閱讀 1611

一、二叉搜尋樹的概念:

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 ...