C語言丨不要閱讀此文,除非你已掌握二叉樹的這些操作

2021-10-11 09:35:49 字數 3393 閱讀 5850

樹是資料結構中一門很重要的資料結構,在很多地方都能經常見到他的面孔,比如資料通訊,壓縮資料等都能見到樹的身影。但是最常見的還是相對簡單的二叉樹,二叉樹和常規樹都可以進行相互轉換。所以,二叉樹的操作必不可少。我這裡來簡單介紹一下。 在資料結構中給的樹和圖中,我們最好使用遞迴來進行各種操作,會讓**更清晰易懂,**也會更簡潔。

新增適當的標頭檔案,定義hex乙個棧資料結構,

首先我們定義乙個二叉樹的資料結構

#include

#include

#define maxsize 100

typedef char elemtype;

typedef struct bitnode

elemtype data;

struct bitnode *lchild, *rchild;

}bitnode, *bitree;

這裡以前序作為例子,前中後序遍歷的不同之在於遞迴的順序

void creatbitree(bitree *t) {

elemtype c;

scanf("%c", &c);

if ('#' == c)

*t = null;

else

*t = (bitnode *)malloc(sizeof(bitnode));

(*t)->data = c;

creatbitree(&(*t)->lchild);

creatbitree(&(*t)->rchild);

這裡依然以前序作為例子,前中後序遍歷的不同之在於遞迴的順序

void preorder(bitree t) {

if (t) {

printf("%c\n", t->data);

preorder(t->lchild);

preorder(t->rchild);

void levelorder(bitree t) {

//用乙個佇列儲存結點資訊,這裡的佇列採用的是順序佇列中的陣列實現

int front = 0;

int rear = 0;

bitree biqueue[maxsize];

bitree tempnode;

if (!isempty_bitree(&t)) {

//將根結點加入到佇列中

biqueue[rear++] = t;

while (front != rear) {

//取出隊頭元素,並使隊頭指標向後移動一位

tempnode = biqueue[front++];

//判斷左右子樹是否為空,若為空,則加入佇列

if (!isempty_bitree(&(tempnode->lchild)))

biqueue[rear++] = tempnode->lchild;

if (!isempty_bitree(&(tempnode->rchild)))

biqueue[rear++] = tempnode->rchild;

//輸出隊頭結點元素

//vist_bitreenode(tempnode->data);

printf("%c\n", tempnode->data);

將二叉樹複製給另乙個二叉樹

void copybitree(bitree t, bitree *newt) {

if (t == null)

*newt = null;

return;

else

*newt = (bitnode *)malloc(sizeof(bitnode));

((*newt)->data) = (t->data);

copybitree(t->lchild, &(*newt)->lchild);

copybitree(t->rchild, &(*newt)->rchild);

計算二叉樹的結點個數

int countleaf(bitree t) {

if (t == null)

return 0;

else {

return countleaf(t->lchild) + countleaf(t->rchild) + 1;

交換一顆二叉樹的左右子樹

void exchange(bitree t)

bitree p;

if (t != null)

p = t->lchild;

t->lchild = t->rchild;

t->rchild = p;

exchange(t->lchild);

exchange(t->rchild);

主函式

void main() {

bitree t=null,newt=null;

creatbitree(&t);

printf("前序遍歷\n");

preorder(t);

printf("中序遍歷\n");

inorder(t);

printf("中後遍歷\n");

postorder(t);

printf("層序遍歷\n");

levelorder(t);

printf("節點個數為%d\n", countleaf(t));

copybitree(t, &newt);

printf("newt前序遍歷\n");

preorder(newt);

exchange(t);

printf("交換左右子樹之後前序遍歷為");

preorder(t);

以上就是二叉樹的一些基本操作,大量運用的遞迴的思想,有問題歡迎指出。

注:上述**在visual studio 2015中編譯成功執行,其他ide請自行測試。

最後,如果你也想成為程式設計師,想要快速掌握程式設計,趕緊加入學習企鵝圈子!

程式設計學習書籍:

C語言 二叉樹的遍歷

樹是一種比較重要的資料結構,尤其是二叉樹。二叉樹是一種特殊的樹,在二叉樹中每個節點最多有兩個子節點,一般稱為左子節點和右子節點 或左孩子和右孩子 並且二叉樹的子樹有左右之分,其次序不能任意顛倒。二叉樹是遞迴定義的,因此,與二叉樹有關的題目基本都可以用遞迴思想解決,當然有些題目非遞迴解法也應該掌握,如...

C語言二叉樹的深度

6 8 求二叉樹高度 20 point s 本題要求給定二叉樹的高度。int getheight bintree bt 其中bintree結構定義如下 typedef struct tnode position typedef position bintree struct tnode 要求函式返回...

二叉樹的建立(C語言)

首先是樹結點的結構 struct treenode typedef struct treenode tnode typedef struct treenode t pointer 這沒什麼說的。建樹的 void build tree t pointer t else 輸出樹 t pointer pr...