1. 二叉排序樹的性質如下:
(1)若左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;
(2)若右子樹不空,則右子樹上所有結點的值均大於或等於它的根結點的值;
(3)左、右子樹也分別為二叉排序樹;
(4)沒有鍵值相等的節點。
2.二叉樹的實現
(1) 節點的定義:
typedef int keytype;
typedef struct node
binarytree, *pbinarytree;
(2) 建立二叉樹節點:
//建立二叉樹節點
pbinarytree createbinarynode(keytype key)
(3) 插入節點到二叉排序樹中:
在已知二叉排序樹t中插入節點
1 若t為空則該節點作為根節點;
2 若插入節點值小於當前節點值則插入到左子樹中;
3 若插入節點值大於當前節點值則插入到右子樹中。
void insertbinarynode(pbinarytree * root, keytype key)
//若key小於當前節點值, 且左子樹為空
if (nullptr == (*root)->m_plchild && key < (*root)->m_data)
//若右子樹為空,且key大於當前根節點值
if (nullptr == (*root)->m_prchild && key >(*root)->m_data)
if (key < (*root)->m_data)
insertbinarynode(&(*root)->m_plchild, key);
else if (key >(*root)->m_data)
insertbinarynode(&(*root)->m_prchild, key);
else
return;
}(4) 建立二叉排序樹:
void createbinarysorttree(pbinarytree * root, keytype arr, int length)
}(5)對二叉排序樹進行資料查詢:1若關鍵字恰好等於當前值,返回該節點;
2若關鍵字小當前節點值,在左子樹中查詢;
3若關鍵字大與當前節點值, 在右子樹中查詢;
4若不存在,返回空。
pbinarytree searchnode(pbinarytree root, keytype key)
(6) 統計二叉排序樹的非空節點:
對問題進行分割化,即先統計子樹的非空節點,當子樹非空節點已知後則比知該樹的非空節點數
1計算左子樹的非空節點數;
2計算右子樹的非空節點數;
3計算該樹的非空節點數;
int numinbinarytree(pbinarytree root)
(6)獲得二叉排序樹的高度:
比較左子樹和右子樹的高度, 若左子樹高度大於右子樹高度,則該樹的高度為左子樹高度+1,否則為右子樹高度+1。
int heightbinarytree(pbinarytree root)
(7)中序遍歷列印節點值:
//按照公升序列印節點
void printbinarytree(pbinarytree root)
測試:int main()
效果:
二叉排序樹
在複習資料結構,把這個東西總結一下。這種結構是動態查詢表,這種動態是相對靜態查詢 順序查詢,折半查詢,分塊查詢等 來說的。對於各種靜態鍊錶,要達到查詢複雜度為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 ...