二叉搜尋樹

2021-08-15 22:23:41 字數 3528 閱讀 7473

二叉搜尋樹的概念

二叉搜尋樹又稱為二叉排序樹,

因為它的特點是1.在根左邊的樹的每個節點都小於根

2.在根右邊的樹的每個節點都於大根

二叉搜尋樹的操作

1. 查詢

pnode findbst(

pnode

proot

, datatype

data

)else

if(pcur->_data >

data

)//當前節點大於要查詢的點

else

pcur = pcur->_pright;}}

2. 插入

intinsertbst(

pnode

* proot

, datatype

data

)else

if(pcur->_data >

data

)else

}pcur = buybstreenode(

data

);//插入結點if(

data

< parent->_data)

elseif(

data

>parent->_data)

}3. 

刪除刪除可分為4種情況

1.要刪除的結點沒有左右子樹(可以歸納到2和3中)

2.要刪除的結點沒有右子樹

3.要刪除的結點沒有左子樹

4.要刪除的結點有左右子樹

(1)如果要刪除的右孩子有左子樹,關鍵在於找到替代的刪除結點,例如刪除5

(2)如果要刪除的點有右子樹,將值替換掉,例如刪除7

ntdeletebstree(

pnode

* proot

, int

data

)pnode

pcur = *

proot

;pnode

parent = *

proot

;while

(pcur)

//找待刪結點

else

if(pcur->_data >

data

)else}if

(null

== pcur)

pnode

pdel = *

proot;if

(null

== pcur->_pright)

//只有左子樹或者是葉子結點

else

if(pcur == parent->_pleft)

//只有左子樹的結點

else

// 葉子結點

parent->_pright = pcur->_pright;

//即指向空}if

(null

== pcur->_pright)

//只有右子樹或者是葉子結點

else

if(pcur == parent->_pright)

else

parent->_pleft = pcur->_pleft;

}else

//左右子樹都存在

pcur->_data = pdel->_data;

if(pdel == parent->_pleft)

parent->_pleft = pdel->_pright;

else

//例如刪除7

parent->_pright = pdel->_pright;

}free(pdel);

}二叉樹的其他操作

void

initbstree(

pnode

* proot

)void

inorderd(

pnode

proot

)//中序

}void

destroybstree(

pnode

* proot

)//銷毀

}pnode

buybstreenode(

datatype

data

)標頭檔案

#include

"stdio.h"

#include

"assert.h"

#include

"malloc.h"

#ifndef

_bstree_h__

#define

_bstree_h__

typedef

char

datatype

;typedef

struct

bstreenode

node

, *pnode

;void

initbstree(

pnode

* proot);

intinsertbst(

pnode

* proot,

datatype

data);

pnode

findbst(

pnode

proot,

datatype

data);

intdeletebstree(

pnode

* proot,

intdata);

void

inorder(

pnode

proot);

void

destroybstree(

pnode

* proot);

pnode

buybstreenode(

datatype

data);

#endif

_bstree_h__

測試函式

#include

"bstree.h"

intmain()

;int

size =

sizeof

(arr) /

sizeof

(arr[0]);

for(

inti = 0; i < size; i++)

inorder(&proot);

findbst(& proot, 6);

deletebstree(& proot, 7);

inorder(proot);

deletebstree(&proot, 9);

inorder(proot);

}

二叉搜尋樹 二叉搜尋樹

題目 二叉搜尋樹 time limit 2000 1000 ms j a others memory limit 32768 32768 k j a others total submission s 6945 accepted submission s 3077 problem descripti...

二叉搜尋樹 修剪二叉搜尋樹

第一反應是重構,看來別人的解答發現,其實不用重構那麼複雜。treenode trimbst treenode root,int low,int high if root val high 下一層處理完左子樹的結果賦給root left,處理完右子樹的結果賦給root right。root left ...

樹 二叉樹 二叉搜尋樹

給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。假設乙個二叉搜尋樹具有如下特徵 節點的左子樹只包含小於當前節點的數。節點的右子樹只包含大於當前節點的數。所有左子樹和右子樹自身必須也是二叉搜尋樹。示例 1 輸入 2 13輸出 true 示例 2 輸入 5 14 3 6輸出 false 解釋 輸入為 ...