資料結構基礎整理 樹 08 二叉排序樹

2021-10-03 01:21:23 字數 1998 閱讀 3466

二叉排序樹的多種操作
二叉排序樹(binary sort tree),又稱二叉查詢樹(binary search tree),亦稱二叉搜尋樹。它可以是一棵空樹。

二叉排序樹必須滿足以下條件:

其實就是普通的二叉樹結構,只不過對裡面的資料有一定的約束。

typedef struct treenode

treenode,*bintree;

//遞迴實現查詢

//指標f指向父結點,初始化為null

//查詢成功返回true,p指向查詢到的結點

//查詢失敗返回false,p指向最後乙個訪問的結點

int searchbst(bintree bt, int key, bintree f, bintree* p)

else if (key == bt->data)//查詢成功

else if (key < bt->data)//若key要小於結點數值,則往左子樹找

else//大於結點值,往右子樹找

}

在依靠查詢函式的時候:

//當二叉排序樹中不存在關鍵字等於key的元素時,插入k,返回true,否則返回false

int insertbst(bintree* bt, int key)

else if (key < p1->data)//小於插入左樹

else//大於插入右樹

return true;

} else

}

在不依賴於查詢函式的時候:

//返回頭節點

bintree insert( bintree bst, int x )

else

else

}return bst;

}

void createbst()

}

要刪除二叉樹中的結點,有三種情況:

直接傳二級指標改變:

int deletebst(bintree* bt, int key)

else

else if (key > (*bt)->data)

else//找到,開始刪除操作

else if ((*p)->right == null)//右孩子為空,重接左孩子

else//左右孩子都不為空

(*p)->data = s->data;

//此時的s是前驅,此時的p是要刪除的那個結點,此時的q是s的父結點

//此時若刪除s,還需考慮的s的左孩子情況

//若s的父結點等於要刪除的結點,說明s就是要刪除的那個結點的左孩子,此時就要把s的左孩子接到q的左孩子上

//若不等於,則將s的左孩子接到q的右孩子上

if (q != *p)

else

free(s);

}} }

傳一級指標,返回刪除後的根結點:

bintree delete(bintree bst,int x)

else

tmp = q;

}bst->data = tmp->data;

bst->right = delete(bst->right, bst->data); // 遞迴刪除要刪除結點的右子樹種最小元素

}else // 被刪除結點有乙個或沒有子結點

}} return bst;

}

尋找最小值的結點,並返回該結點:

bintree findmin(bintree bst)

} return bst;

}

尋找最大值結點,並返回該結點:

bintree findmax(bintree bst)

} return bst;

}

本章結束。

資料結構知識整理 二叉排序樹

資料結構 查詢演算法 插入演算法 建立演算法 刪除演算法 可回顧 基本概念 若在查詢的同時對錶做插入 刪除等修改操作,則被查詢的表稱為動態查詢表,反之則稱為靜態查詢表。換句話說,動態查詢表的表結構本身是在查詢過程中動態生成的,即在建立表時,對於給定值,若表中存在其關鍵字等於給定值的記錄,則返回 已存...

資料結構 二叉排序樹

二叉排序樹是一種特殊結構的二叉樹,它作為一種表的組織手段,通常被稱為 樹表。可以作為一種排序和檢索的手段。定義 二叉排序樹或是空樹,或是具有下述性質的二叉樹 其左子樹上所有結點的資料值均小於根結點的資料值 右子樹上所有結點的資料值均大於或等於根結點的資料值。左子樹和右子樹又各是一棵二叉排序樹。對二叉...

資料結構 二叉排序樹

二叉排序樹 binarysorttree 具有下列性質的二叉樹 1 若左子樹不空,則左子樹上所有結點的值均小於它的根結點的值 2 若右子樹不空,則右子樹上所有結點的值均大於它的根結點的值 3 左 右子樹也分別為二叉排序樹 include includeusing namespace std type...