二叉檢索樹中插入和刪除操作

2021-08-20 14:45:53 字數 2449 閱讀 2923

/*********************************

二叉排序樹的相關操作實現

**********************************/

#include#includetypedef struct node

node, *bstree;

/*在指標ptree所指的二叉排序樹中遞迴查詢關鍵字為key的元素,

若查詢成功,則返回指向該元素節點的指標,否則返回null

*/bstree search(bstree ptree, int key)

/*在指標ptree所指的二叉排序樹中遞迴查詢關鍵字為key的元素,

若查詢成功,則返回ture,並查詢到的資料對應的節點指標儲存在p中,

否則返回false,並將查詢路徑上訪問的最後乙個節點指標儲存在p中。

這裡的引數parent指向每次遞迴遍歷的子樹的根節點的父節點,即始終是引數ptree的父節點,

它的初始值為null,其目的是跟蹤查詢路徑上訪問的當前節點的父節點(即上乙個訪問節點)

該函式用來被後面的插入函式呼叫。

*/bool search_bstree(bstree ptree, int key, bstree parent, bstree &p)

else //否則,繼續查詢

else if (key < ptree->data) //在左子樹中遞迴查詢

return search_bstree(ptree->lchild, key, ptree, p);

else //在右子樹中遞迴查詢

return search_bstree(ptree->rchild, key, ptree, p); }}

/*當在ptree所指向的二叉排序樹中查詢不到關鍵字為key的資料元素時,

將其插入該二叉排序樹,並返回ture,否則返回false。

樹空時插入會改變根節點的值,因此要傳入引用。

*/bool insert(bstree &ptree, int key)

else

return false;}/*

採用第一種演算法從二叉排序樹中刪除指標p所指向的節點,

並在保持二叉排序樹有序的情況下,將其左右子樹重接到該二叉排序樹中.

該函式主要用來被後面的刪除函式呼叫

*/void delete_node1(bstree &p)

else if (!p->rchild)

else }

/*採用第二種演算法從二叉排序樹中刪除指標p所指向的節點,

並在保持二叉排序樹有序的情況下,將其左右子樹重接到該二叉排序樹中.

該函式主要用來被後面的刪除函式呼叫

*/void delete_node2(bstree &p)

else if (!p->rchild)

else

//用s來替換待刪節點p

p->data = s->data;

//根據情況,將s的左子樹重接到q上

if (p != q)

q->rchild = s->lchild;

else

q->lchild = s->lchild;

free(s); }}

/*若ptree所指向的二叉排序樹中查詢到關鍵字為key的資料元素,

則刪除該元素對應的節點,並返回true,否則返回false

如果要刪除的恰好是根節點,則會改變根節點的值,因此要傳入引用

*/bool delete_bstree(bstree &ptree, int key)

else if (key < ptree->data) //繼續查詢左子樹

return delete_bstree(ptree->lchild, key);

else //繼續查詢右子樹

return delete_bstree(ptree->rchild, key); }}

/*根據所給的長為len的arr陣列,按陣列中元素的順序構建一棵二叉排序樹

*/bstree create_bstree(int *arr, int len)}/*

遞迴銷毀二叉排序樹

*/void destroy_bstree(bstree ptree)

}int main()

else

printf("插入失敗,該二叉排序樹中已經存在整數%d\n", key);

//刪除給定的整數

printf("請輸入要刪除的整數:");

scanf("%d", &key);

if (delete_bstree(ptree, key))

else

printf("刪除失敗,該二叉排序樹中不存在整數%d\n", key);

return 0;

}

二叉查詢樹(二叉排序樹)建立,插入,刪除操作。

尋找節點就是直接依據數值的大小。從root節點開始遍歷,大於當前遍歷節點就向它的右子樹查詢,相反則查詢它的左子樹。然後返回。直接依據root節點,遍歷到最右就是最大節點,遍歷到最左,就是最小節點。插入節點我這裡插入的節點都會成為葉子節點。依據大小的關係向下遍歷,遍歷到最後的節點,然後插入就能夠了。這...

二叉查詢樹的查詢和插入和刪除操作

二叉搜尋樹也稱二叉排序樹或二叉查詢樹 二叉搜尋樹 一顆二叉樹可以為空 如果不為空,滿足以下性質 1.非空左子樹的所有鍵值小於其根結點的鍵值。2.非空右子樹的所有鍵值大於其根節點的鍵值。3.左 右子樹都是二叉搜尋樹。查詢 find 3.若兩者比較結果是相等,返回指向此結點的指標 尾遞迴position...

二叉搜尋樹的插入和刪除

include include using namespace std typedef struct nodenode,pnode void binary tree insert pnode pn,pnode pz 二叉樹插入操作 else pz parent y if y null else if...