二叉搜尋樹的基本操作

2021-08-20 03:26:09 字數 2925 閱讀 3533

#pragma once

typedef int datatype;

typedef struct bstreenode

bstnode;

#include

#include

#include

bstnode* buybstreenode(datatype data)

pnewnode->_data =

data;

pnewnode->_pleft =

null;

pnewnode->_pright =

null;

return pnewnode;

}void bstreeinit(bstnode** proot)

void bstreeinsert(bstnode** proot,datatype data)//非遞迴的

//1、找待插入節點的插入位置

pcur =

*proot;//從根的位置找

while(pcur)

else

if(data

>pcur->_data)

else

//說明已經存在了

return;

}//2、插入新節點

pcur = buybstreenode(data);

if(data

< pparent->_data)//如果插入的新資料小於雙親的資料往左邊插

pparent->_pleft = pcur;

else

pparent->_pright = pcur;

}void bstreeinsert(bstnode** proot,datatype data)//遞迴的

}void bstreedelete(bstnode** proot,datatype data)//刪除結點(非遞迴的)

else

}if(pcur ==

null)

return;

//只有右孩子 或者 是葉子節點

if(pcur->_pleft ==

null)

else

}else

if(null

== pcur->_pright)//只有左孩子

}else

pcur->_data = pdel->_data;//在右子樹中刪除pdel

if(pdel == pparent->_pleft)//要刪除的pdel是雙親的左孩子

pparent->_pleft = pdel->_pright;

else

pparent->_pright = pdel->_pright;

pcur = pdel;

}free(pcur);

}void bstreedelete(bstnode** proot,datatype data)//刪除結點(遞迴的)

else

if(null

== pdel->_pright) //只有左孩子

else

//左右孩子都存在}}

}bstnode* bstreefind(bstnode* proot,datatype data)//非遞迴

return

null;

}bstnode* bstreefind(bstnode* proot,datatype data)//遞迴的

}void inorder(bstnode* proot)//中序遍歷

}void bstreedestroy(bstnode** proot)

}void testbstree()

; int i = 0;

bstnode* proot;

bstreeinit(&proot);

for(;i < sizeof(a)/sizeof(a[0

]);++i)

printf("中序遍歷的結果:");

inorder(proot);

printf("\n");

bstreeinsert(&proot,10);

bstreedelete(&proot,2);

printf("中序遍歷的結果:");

inorder(proot);

printf("\n");

bstreedelete(&proot,1);

printf("中序遍歷的結果:");

inorder(proot);

printf("\n");

//分別刪除5 和 7

bstreedelete(&proot,5);

//bstreedelete(&proot,7);

printf("中序遍歷的結果:");

inorder(proot);

printf("\n");

bstreedestroy(&proot);

//bstreedelete(&proot,2);

}//1、刪除的該結點左右孩子均為空(葉子)-----直接刪除

//2、刪除的該結點只有左孩子------直接刪除

//3、刪除的該結點只有右孩子------直接刪除

/*(1)待刪除的結點沒有雙親

(2)待刪除節點是其雙親的左或者右

(1)是雙親的左:pparent->left = pcur->right

(2)是雙親的右:pparent->right = pcur->right*/

//4、刪除的該結點左右孩子都存在:一、在左子樹或者右子樹找替代結點

//(1)、左子樹中找替代---找左子樹中最大的結點

//(2)、右子樹中找替代---找右子樹中最小的結點

//二、將替代結點中的資料交給待刪除結點(pdel)

//三、連線起來

/*(1)pdel為其雙親的左孩子

(2)pdel為其雙親的右孩子*/

二叉搜尋樹的基本操作

建立乙個非負二叉搜尋樹 1表空結點 編寫查詢函式,層序遍歷函式,插入函式,刪除函式,查詢最大值最小值函式 輸入該樹和要查詢的值 輸出 如果找到,列印出 x is found 沒找到列印出 not found 列印出層序遍歷序列 刪除最大值和最小值 刪除成功輸出 x is delete 最後再進行一層...

二叉搜尋樹的基本操作

二叉搜尋樹 binary search tree 它或者是一棵空樹,或者是具有下列性質的二叉樹 若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值 它的左 右子樹也分別為二叉搜尋樹樹。節點設定 typedef int datat...

二叉搜尋樹的基本操作

binsearchtree.h typedef int datatype typedef struct bstreenode bstnode,pbstnode 初始化二叉搜尋樹 void initbstree bstnode proot 生成新節點 pbstnode buynewnode datat...