写这篇纯属个人兴趣了😂
要遍历二叉树的话优先推荐用递归的方法
在传统的遍历二叉树时,如果要使用递归的方法
前序遍历:
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
大家也可以自己搜索流程图辅助理解