二叉搜尋樹

2021-10-12 02:51:51 字數 2938 閱讀 6246

/*

二叉搜尋樹: 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 解釋 輸入為 ...