二叉搜尋樹的概念
二叉搜尋樹又稱為二叉排序樹,
因為它的特點是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 解釋 輸入為 ...