/*
二叉搜尋樹: 1.每個資料都具有唯一的關鍵字
2.比根節點關鍵字打的放右邊,小的放左邊,所以每一次縮減都可以至少排除一半的數
3.二叉搜尋樹的每乙個子樹都是二叉搜尋樹
採用中序遍歷進行排序,左,根,右
*/#include
#include
#include
//每乙個節點的資料
typedef
struct datapair
data,*lpdata;
//二叉樹結構體
ytpedef struct treenode
node,
*lpnode;
//封裝乙個二叉樹組
typedef
struct binarysearchtree
bst,
*lpbst;
//建立樹
lpbst createbst()
//建立節點
lpnode createnode
(data data)
//萬金油函式
intsize
(lpbst tree)
intempty
(lpbst tree)
//列印遍歷
void
printnode
(lpnode curnode)
//中序遍歷
void
midorder
(lpnode tree)
}//插入節點
void
insertnode
(lpbst tree,data data)
else
if(data.first>pmove->data.first)
else
}//退出迴圈,找到了合適的位置
if(tree->root ==
null
)//一次都不迴圈
else
else}}
tree->treesize++;}
//查詢,通過關鍵字去查詢
lpnode searchbst
(lpnode tree,
int first)
else
if(pmove ==
null
)return pmove;
}return pmove;}}
//二叉搜尋樹的刪除,先刪除根節點,是需要調整的,一種是:從左子樹中找根節點左邊最大的數放上去;另一種是:從右子樹最左邊把根節點右邊最小的數放上去
void
erase
(lpbst tree,
int first)
else
if(first > pmove->data.first)
else
break;}
if(pmove ==
null
)//刪除節點的左右子樹都存在,我們要找左子樹的最右邊放上去,因為左子樹最右邊的數是最大的,如果不是它,就不能完成按大小順序排列
if(pmove->lchild !=
null
&& pmove->rchild !=
null
) lpnode newnode =
createnode
(movenode->data)
; newnode->lchild = pmove->lchild;
newnode->rchild = pmove->rchild;
//儲存pmove刪除結點的左右子樹
//分類討論刪除的節點
if(pmoveparent ==
null
)//刪除的是根節點
tree->root = newnode;
else
if(pmove == pmoveparent->lchild)
pmoveparent->lchild = newnode;
else
pmove->rchild = newnode;
//調整二叉樹
if(movenodeparent == pmove)
else
free
(pmove)
; pmove = movenode;
} lpnode snode =
null
;//如果刪除結點左右存在節點,儲存刪除結點的下乙個節點
if(pmove->lchild !=
null
) snode = pmove->lchild;
else
snode = pmove->rchild;
if(tree->root == pmove)
else
else
}free
(pmove)
; tree->treesize--;}
intmain()
;for
(int i=
0;i<
8;i++
)printf
("中序遍歷結果:\n");
midorder
(tree->root)
;//輸出結果,按數字大小進行排序
printf
("查詢55:");
printnode
(searchbst
(tree,55)
);//查詢到的是 「卡爾」
erase
(tree,30)
;midorder
(tree->root)
;printf
("\n");
system
("pause");
return0;
}
二叉搜尋樹 二叉搜尋樹
題目 二叉搜尋樹 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 解釋 輸入為 ...