用非遞歸的方法中序遍歷二叉樹


寫這篇純屬個人興趣了😂

要遍歷二叉樹的話優先推薦用遞歸的方法

在傳統的遍歷二叉樹時,如果要使用遞歸的方法

前序遍歷:

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

大家也可以自己搜索流程圖輔助理解

      

      


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM