#include
#include
typedef
struct
binode
char data;
struct
binode *lchild;
struct
binode *rchild;
}binode, *bitree;
int creatbitree(bitree &t)
int m;
scanf("%d", &m);
if (m == -1)
t=null;
else
t = (bitree)malloc(sizeof(binode));
t->data = m;
printf("請輸入%d的左孩子", m);
creatbitree(t->lchild);
printf("請輸入%d的右孩子", m);
creatbitree(t->rchild);
return 0;
void printfbitree(bitree
t)if (t == null)
return;
printf("%d", t->data);
printfbitree(t->lchild);
printfbitree(t->rchild);
int main()
bitree t;
bitree *p = (bitree*)malloc(sizeof(binode));
printf("請輸入根節點的值,當任何節點為-1時代表為空節點\n");
creatbitree(t);
printfbitree(t);
system("pause");
我來以乙個小白的角度一點一點給大家說一下如果用遞迴演算法建立和遍歷乙個二叉樹。
typedef
struct
binode
char data;
struct
binode *lchild;
struct
binode *rchild;
}binode, *bitree;
這個結構大家學了資料結構之後肯定都不會很陌生,這裡需要注意的就是在定義指標的時候前邊用的是自己所定義的結構體型別,指標定義的時候前邊並不是咱們常見的int型,char型等等 應該是 struct +你的結構體型別。另乙個問題就是我剛開始的時候困惑了很久的,為什麼要在花括號後邊加上兩個binode, *bitree;這裡可能我說的不對,我現在所理解的就是,你前邊這個就是你的結構體型別所以你寫的和你上邊typedef後邊寫的一樣就行,甚至可以你上邊不寫只在花括號後邊來寫上,之後帶星號的那個就是你的結構體指標型別。目前對這個的作用我還不是很清楚,但是不影響寫程式,記住那個固定的寫程式模式就沒有問題,在之後我一定會對這兩個東西做更加詳細的解釋和**。下邊先說今天的成果二叉樹的建立和遍歷。
首先說二叉樹的建立。
int creatbitree(bitree &t)
int m;
scanf("%d", &m);
if (m == -1)
t=null;
else
t = (bitree)malloc(sizeof(binode));
t->data = m;
printf("請輸入%d的左孩子", m);
creatbitree(t->lchild);
printf("請輸入%d的右孩子", m);
creatbitree(t->rchild);
return 0;
int creatbitree(bitree &t)
先看這句話,這個函式開始既可以是int也可以是其他的,後邊括號的是你需要對這個函式引入乙個引數,這個引數的型別要是你的結構體指標型別,t前邊的取位址符可以要可以不要,對程式並不影響。
int m;
scanf("%d", &m);
這句話是你建立乙個int型別的數字,然後從鍵盤中獲得。
if (m == -1)
就必須要有乙個遞迴的終結邊界值,在這裡這個-1就是遞迴的終結值。
if (m == -1)
t=null;
也就是說如果你的二叉樹的結點值是-1的話,那麼這個結點就是乙個空的結點,就不再會建立這個結點。
else
t = (bitree)malloc(sizeof(binode));
t->data = m;
printf("請輸入%d的左孩子", m);
creatbitree(t->lchild);
printf("請輸入%d的右孩子", m);
creatbitree(t->rchild);
如果輸入的值不是-1的話,那麼就會進行else中的步驟。
t = (bitree)malloc(sizeof(binode));
先給這個t開闢乙個記憶體空間用來儲存它。這個malloc函式前邊後邊的兩個東西也是有區別的,前邊就是這個結構體的指標型別,後邊sizeof就是這個結構體的型別,應該不難理解,sizeof肯定是分配型別的大小,不同型別分配的大小肯定是不一樣的,所以結構體型別是在sizeof後邊然後指標型別相應的就在前邊了。
t->data = m;
printf("請輸入%d的左孩子", m);
creatbitree(t->lchild);
printf("請輸入%d的右孩子", m);
creatbitree(t->rchild);
後邊的就相對來說比較好理解了,將m的值給了t中的data域,之後再不斷的呼叫這個函式來給他的左右孩子往下賦值,一直到結點的值是-1的時候就不再給這個結點開闢空間了,也就沒有之後的操作,程式也就終止了。
void printfbitree(bitree
t)if (t == null)
return;
printf("%d", t->data);
printfbitree(t->lchild);
printfbitree(t->rchild);
對於輸出的函式也是運用遞迴的演算法,如果能夠理解建立的時候的遞迴演算法的話,輸出的就很簡單的理解了。
int main()
bitree t;
bitree *p = (bitree*)malloc(sizeof(binode));
printf("請輸入根節點的值,當任何節點為-1時代表為空節點\n");
creatbitree(t);
printfbitree(t);
system("pause");
主函式中需要先建立這個t之後,先開闢第乙個根節點,因為在建立函式中上來是要對結點的data域進行判斷的。之後直接呼叫兩個函式就可以了。
這是我對二叉樹的建立和遍歷自己的理解,可能有些不準確或者是錯誤的,希望讀者看到之後能給我糾正,給我一些建議。
雖然程式十分的簡單但是對於我乙個新手來說我寫了三個半小時,對於二叉樹的其他遍歷方法我會之後更新。
建立二叉樹,層序 先序遍歷
要求能夠輸入樹的各個結點,並能夠輸出用不同方法遍歷的遍歷序列 分別建立建立二叉樹儲存結構的的輸入函式 輸出層序遍歷序列的函式 輸出先序遍歷序列的函式 源 include include define max 20 typedef char telemtype typedef int status t...
建立二叉樹(遞迴 先序遍歷)
建立二叉樹 遞迴 先序遍歷 1 自輸入資料元素,形參為引用型別或二級指標 class treenode 遞迴 先序遍歷建立二叉樹 void createbinarytree treenode root 形參必須宣告為引用型別或二級指標 else root nullptr 輸入 1 2 3 1 1 4...
先序構建二叉樹及先序遍歷二叉樹
先序為dlr d 根節點,l 左子樹,r 右子樹 a b c d e 先序序列為abdce,輸入為abd c e 表示空格,代表空樹 輸入按滿二叉樹輸入 每乙個節點都是乙個子樹的根節點 void pre create tree treenode t else else void pre visit ...