二叉排序樹

2021-10-23 10:45:52 字數 3356 閱讀 2846

插入刪除

遍歷樹的高度

思考

資料結構中,線性表分為無序線性表和有序線性表

無序線性表就是無序,插入和刪除沒有任何規律,查詢時要遍歷整棵樹,效率低

有序線性表:有較高插入和刪除效率,並且具備較高查詢效率。因此二叉排序樹誕生

參考

二叉排序樹又稱二叉查詢樹、二叉搜尋樹。是一種特殊的二叉樹。

若左子樹不為空,則二叉樹上所有結點的值均小於或等於它根結點的值

若右子樹為不空,而二叉樹上所有結點的值均島嶼或等於它根結點的值

左右子樹分別又是一棵二叉排序樹

typedef

struct node node;

typedef

struct

tree;

查詢指定value值的結點
若查詢關鍵字等於根結點,成功

否則若小於根結點,查詢其左子樹

若大於根結點,查詢其右子樹

同理,在左右子樹上類似

node*

searchbst

(node* node,

int value)

查詢最大結點值
node*

_max

(node* node)

intmax_search

(tree* tree)

printf

("%d\n"

,max_search

(&tree)

);

查詢最小結點值
node*

_min

(node* node)

intmin_search

(tree* tree)

printf

("%d\n"

,min_search

(&tree)

);

查詢前驅
如果x存在左孩子,x的前驅結點為左子樹的最大值

如果x沒有左子樹:

(1)x是乙個右孩子,它的前驅結點為它的父親結點

(2)x是乙個左孩子,查詢最低的父親結點,該父親結點要具有右孩子,找到的這個最低父親結點就是x的前驅結點

node*

pre_node

(node* node)

return temp;

}

查詢後繼
如果x存在右孩子,x的後繼結點為右子樹的最小值

如果x沒有右子樹:

(1)x是乙個左孩子,它的後繼結點為它的父親結點

(2)x是乙個右孩子,查詢最低的父親結點,該父親結點要具有左孩子,找到的這個最低父親結點就是x的後繼結點

node*

post_node

(node* node)

node* temp=node-

>father;

while

(temp!=

null

&&node==temp-

>r)

return temp;

}

若二叉排序樹為空,則插入結點為根結點。

否則,繼續在左右子樹上查詢

樹中已有,不再插入。

樹中沒有,查詢至某結點左子樹或者右子樹為空為止。插入應為該結點的左孩子或者右孩子。插入元素一定是葉子結點。

不同插入次序生成不同形態的二叉排序樹

void

insert

(tree* tree,

int value)

node* temp1;

while

(temp!=

null)

node-

>father=temp1;

if(node-

>data>data)

temp1-

>l=node;

else temp1-

>r=node;

}

刪除要考慮三種情況:

(1)刪除結點為葉子結點

(2)刪除結點只有左子樹或者只有右子樹

(3)刪除結點又有左子樹又有右子樹

相應解決辦法:

情況一:其雙親結點指標域的值改為「空」

情況二:其雙親結點的相應指標域的值改為被刪除結點的左子樹或右子樹

情況三:以其前驅(後繼)代替,然後再刪除該前驅(後繼)結點

node*

deletenode

(node* node,

int value)

else

else

if(node-

>r!=

null

)else

delete

(node);}

return

null;}

else

if(value>node-

>data)

node-

>r=

deletenode

(node-

>r,value)

;else

if(value>data)

node-

>l=

deletenode

(node-

>l,value)

;return node;

}

遍歷與普通二叉樹相同。二叉排序樹的中序遍歷是遞增有序

void

preorder

(node* node)

return;}

void

inorder

(node* node)

}void

postorder

(node*node)

}

int

get_height

(node* node)

}

斜樹:所有結點都只有左子樹的二叉樹叫左斜樹;所有結點都只有右子樹的二叉樹叫右斜樹。

所以平均情況下查詢的複雜度為o(lgn)

最壞情況下查詢的複雜度為o(n)

二叉排序樹

在複習資料結構,把這個東西總結一下。這種結構是動態查詢表,這種動態是相對靜態查詢 順序查詢,折半查詢,分塊查詢等 來說的。對於各種靜態鍊錶,要達到查詢複雜度為o logn 必須要求有序 而要使插入刪除複雜度為o 1 必須是鍊錶儲存。動態查詢表就可以同時滿足這兩者。動態查詢表的特點是表結構本身在查詢過...

二叉排序樹

name 二叉排序樹相關操作 author unimen date 2011 10 8 13 14 21 刪除結點比較麻煩,總結如下 4大種情況 1 結點p無右孩子 將該點的左孩子變為其在雙親中的同位孩子 1 p為其雙親的左孩子時將其的左孩子變為雙親的左孩子 2 p為其雙親的右孩子時將其的左孩子變為...

二叉排序樹

include include include include struct tree node void insert node struct tree node int void pre order struct tree node void in order struct tree node ...