2018.1.20更新。
二叉搜尋樹是一種,昂,很厲害的資料結構。
下面是大一上學期學c語言的**,來自應該燒香供著的聖經《c程式語言》。
裡面有加節點和列印樹的操作,freetree是我當時自己寫的。
本來我現在更新應該加個deletetree來著,但是有點懶。。姑且寫一下刪除的演算法,就不實現了。
(後面有c++模板,敲題目可以直接用)。
deletetree刪除方法:
刪除的最大問題就是怕刪了乙個節點後它的後代們就懸空了,這時候肯定要從後代中找乙個優秀的後代來繼承爸爸爺爺太爺爺的位置。
我們知道乙個節點的左子樹是比老爸小的,右子樹是比老爸大的,所以把刪除節點的左子樹的最大節點(也就是盡量取右邊)提上去。
這樣這個節點肯定和原來的要被刪除的節點一樣比左兒孫們都大比右兒孫們都小。(從右子樹選最小的也沒毛病吧)。
這裡的二叉樹是儲存字串的,大體結構和一般的沒啥區別,就不多說了,欣賞聖經裡優美的**。
還有後面模擬的緩衝區也很漂亮。
#include #include #include #include #define maxword 1000
struct tnode//節點
;struct tnode *addtree(struct tnode *, char *);
void treeprint(struct tnode *);
int getword(char *, int);
void freetree(struct tnode *p);//原文沒有這個函式,本來也沒寫,心疼一下堆疊
int main()
treeprint(root);
freetree(root);
return 0;
}void treeprint(struct tnode *t)//遞迴列印樹
}struct tnode *talloc(void)//封裝malloc
struct tnode *addtree(struct tnode *r, char *s)//遞迴
else if( (cond = strcmp(s, r->s)) < 0 )//cond記錄比較結果
r->left = addtree( r->left, s );
else if( cond > 0)
r->right = addtree( r->right, s );
else
r->count++;//如果已經存在,計數器自增
return r;
}void freetree(struct tnode *p)
}//getch和ungetch的實現,ungetch把沒用的已經讀入字元
//存回緩衝區,用自己定義的棧實現
int buf[bufsiz];
int bp = 0;
int getch()//如果棧空了,讀入緩衝區的內容
void ungetch(int c)
int getword(char *word, int n)
for(; --n; s++)
if( !isalnum( *s = getch() ) )
*s = '\0';
return word[0];//判斷是否eof
}
來自《c程式語言》,有改動。
昂既然更新就再加個c++模板類:
#include #include using namespace std;
int main()
沒上cplusplus查,應該還有一些其他操作。
來自《挑戰程式設計競賽》,有改動。
二叉樹 還原二叉樹 二叉搜尋樹
先序遍歷的特點 先遍歷根結點,再遍歷左子樹,最後再遍歷右子樹 中序遍歷的特點 先遍歷左子樹,再遍歷根結點,最後再遍歷右子樹 後序遍歷的特點 先遍歷左子樹,再遍歷右子樹,最後再遍歷根結點 舉例 先序遍歷 a b d f g h i e c 中序遍歷 f d h g i b e a c 如上,根據先序遍...
樹 二叉樹 二叉搜尋樹
給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。假設乙個二叉搜尋樹具有如下特徵 節點的左子樹只包含小於當前節點的數。節點的右子樹只包含大於當前節點的數。所有左子樹和右子樹自身必須也是二叉搜尋樹。示例 1 輸入 2 13輸出 true 示例 2 輸入 5 14 3 6輸出 false 解釋 輸入為 ...
排序二叉樹or搜尋二叉樹or查詢二叉樹
排序二叉樹,搜尋二叉樹,查詢二叉樹都是乙個意思,只是叫法不同而已。下面的文章中我們統稱為排序二叉樹。本文主要是針對高中資訊學,因此其中不涉及到指標,所有需要用指標的地方都直接使用陣列進行模擬。排序二叉樹定義 1 若左子樹不空,則左子樹上所有結點的值均小於或等於它的根結點的值 2 若右子樹不空,則右子...