/*********************************
二叉排序樹的相關操作實現
**********************************/
#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...