二叉排序樹的多種操作
二叉排序樹(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...