寫這篇純屬個人興趣了😂
要遍歷二叉樹的話優先推薦用遞歸的方法
在傳統的遍歷二叉樹時,如果要使用遞歸的方法
前序遍歷:
void FrontOrder(biTree *s)
{
if(s){
printf("%d",s->data);
FrontOrder(s->lchild);
FrontOrder(s->rchild);
}
}
中序遍歷:
void InOrder(biTree *s)
{
if(s){
InOrder(s->lchild);
printf("%d",s->data);
InOrder(s->rchild);
}
}
后續遍歷:
void PostOrder(biTree *s)
{
if(s){
PostOrder(s->lchild);
PostOrder(s->rchild);
printf("%d",s->data);
}
}
用棧的話👇,話不多說,上代碼
#include <stdio.h> #define maxsize 24 typedef struct node{ char data; struct node *lchild; struct node *rchild; }biTree; biTree * Q[maxsize]; biTree * Creat(){ char ch; int front,rear; biTree *root,*s; root = NULL; // ---------- front = 1; rear = 0; // ----------置空隊列 ch = getchar(); while(ch!='#'){ s = NULL; if(ch!='@'){ s = (biTree*)malloc(sizeof(biTree)); s->data = ch; s->lchild = NULL; s->rchild = NULL; } rear++; Q[rear] = s; if(rear==1)root = s; else{ if(s&&Q[front]) { if(rear%2==0)Q[front]->lchild = s; else Q[front]->rchild = s; } if(rear%2==1)front++; } ch = getchar(); } return root; } typedef struct { biTree data[maxsize]; int top; }seq; void setnull(seq *s) { s->top = -1; } seq *PUSH(seq *s,biTree x) { if(s->top==maxsize-1){ printf("overflow\n"); return (NULL); } else{ s->top++; s->data[s->top] = x; } return s; } int empty(seq *s) { if(s->top>=0)return 0; else return 1; } biTree POP(seq *s) { biTree *emp = NULL; if(empty(s)){ printf("underflow.\n"); return *emp; } else{ s->top--; return (s->data[s->top+1]); } } biTree *top(seq *s) { biTree *emp = NULL; if(empty(s)){ printf("stack is empty.\n"); return emp; } else return (&s->data[s->top]); } void inOrder(biTree *t) { biTree *root = t; seq s; setnull(&s); if(t) { while(root||!empty(&s)){ while(root) { PUSH(&s, *root); root = root->lchild; } if(!empty(&s)) { printf("%c ",s.data[s.top].data); root = top(&s); root = root->rchild; POP(&s); } } } } int main() { biTree *root = Creat(); inOrder(root); printf("\n"); return 0; }
解釋一下函數的運行過程
void inOrder(biTree *t) { biTree *root = t; seq s; setnull(&s); if(t) { while(root||!empty(&s)){ while(root) { PUSH(&s, *root); root = root->lchild; } if(!empty(&s)) { printf("%c ",s.data[s.top].data); root = top(&s); root = root->rchild; POP(&s); } } } }
1、當節點 t 非空的話讀如二叉樹
2、如果當前節點不為 “空或者棧非空” 開始循環
3、內部循環:
當前節點非空時,把當前節點壓入棧,然后一直找到它的左孩子為空
找完左孩子,開始你要進行的操作
當棧非空時,輸出當前節點的數據
根結點指向右孩子,根結點出棧
4、下一步就開始找右孩子的左子樹,開始下一步循環直到棧空並且當前節點為NULL
大家也可以自己搜索流程圖輔助理解