插入刪除
遍歷樹的高度
思考
資料結構中,線性表分為無序線性表和有序線性表參考無序線性表就是無序,插入和刪除沒有任何規律,查詢時要遍歷整棵樹,效率低
有序線性表:有較高插入和刪除效率,並且具備較高查詢效率。因此二叉排序樹誕生
二叉排序樹又稱二叉查詢樹、二叉搜尋樹。是一種特殊的二叉樹。若左子樹不為空,則二叉樹上所有結點的值均小於或等於它根結點的值
若右子樹為不空,而二叉樹上所有結點的值均島嶼或等於它根結點的值
左右子樹分別又是一棵二叉排序樹
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 ...