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