看東西容易,寫東西確實就複雜多了呀,花了兩天時間把二叉樹的資料結構及一些相關基本演算法的原理認真研究了下,並寫出了相應的**,包括二叉樹的前序建立、前中後序遍歷、層序遍歷、刪除、通過前序和中序序列構造二叉樹等等
#include
//定義資料元素型別
typedef int element;
//定義二叉樹節點
typedef struct bitree
bitree;
//定義佇列節點,層序遍歷
typedef struct queuenode
queuenode;
typedef struct queue
queue;
//建立佇列
void createqueue(queue **q)
//入隊操作
void enqueue(queue *q, bitree *data)
}//出隊操作
void dequeue(queue *q, bitree **t)
}//判斷佇列是否為空
int isqueueempty(queue *q)
//二叉樹的建立
void createbitree(bitree **t)
}//根據前序和中序遍歷結果生成二叉樹(總是假設給定的序列是有效的,這裡不進行錯誤檢測)
//@param p 遞迴前序子串行的起始位置
//@param m 遞迴中序子串行的起始位置
//@param length 遞迴子串行的長度
void crebypremid(bitree **t, int p, int m, int length, int *pre, int *mid)
//若有右子樹則建立右子樹
if(iright, p+1+i, m+i+1, length-i-1, pre, mid);}}
//刪除樹
void delbitree(bitree **t)
}//二叉樹的前序遍歷
void preorder(bitree *t)
}//二叉樹的中序遍歷
void midorder(bitree *t)
}//二叉樹的後序遍歷
void afterorder(bitree *t)
}//二叉樹的層序遍歷
//思路:利用佇列,如果樹不為空,將根節點入隊
// 然後迴圈隊頭元素出隊,並作一下處理:判斷出隊的節點是否有左孩子,有則將左孩子入隊,判斷出隊的節點是否有右孩子,有則將又孩子入隊。
// 重複以上過程直到隊列為空
void layorder(bitree *t)
//釋放佇列空間
if(isqueueempty(q))
}int main()
;int mid[6] = ;
crebypremid(&t, 0, 0, 6, pre, mid);
printf("after crebypremid, the preorder result is: ");
preorder(t);
printf("\n\n");
return 0;
}
二叉樹的一些操作
標頭檔案 樹.h pragma once include include include include include include typedef char datatype typedef struct btnodebtnode btnode greattree datatype pre,i...
二叉樹的一些操作
1 include 2 include 3 4 typedef struct binodebinode,bitree 910 void createbitree bitree t 建立二叉樹 11int gettreeheight bitree t 返回二叉樹高度 12int getallnode ...
二叉樹的一些操作
1 include 2 include 3 4 typedef struct binodebinode,bitree 910 void createbitree bitree t 建立二叉樹 11int gettreeheight bitree t 返回二叉樹高度 12int getallnode ...