初步學習二叉排序樹

2022-09-23 10:09:07 字數 1661 閱讀 1582

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