【二叉树】建树以及先中后序递归与非递归遍历

【二叉树】建树以及先中后序递归与非递归遍历

注意点

采用先序建树
非递归用到栈的知识

递归实现三种遍历

#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
int level = 1;
typedef struct node{
    char data;
    struct node *lchild;
    struct node *rchild;
}BiTNode, *BiTree;
void CreateBiTree(BiTree &T){
    char ch;
    scanf("%c", &ch);
    if (ch == '#') T = NULL;
    else {
        T = (BiTree)malloc(sizeof(BiTNode));
        T->data = ch;
        CreateBiTree(T->lchild);
        CreateBiTree(T->rchild);
    }
}
void PreOrderTraverse(BiTree t, int level){
    if (t == NULL) return;
    printf("data=%c, level=%d\n", t->data, level);
    PreOrderTraverse(t->lchild, level+1);
    PreOrderTraverse(t->rchild, level+1);
}
void InOrderTraverse(BiTree t, int level){
    if (t == NULL) return;
    InOrderTraverse(t->lchild, level+1);
    printf("data=%c, level=%d\n", t->data, level);
    InOrderTraverse(t->rchild, level+1);
}
void PostOrderTraverse(BiTree t, int level){
    if (t == NULL) return;
    PostOrderTraverse(t->lchild, level+1);
    PostOrderTraverse(t->rchild, level+1);
    printf("data=%c, level=%d\n", t->data, level);
}
int main(){
    BiTree t = NULL;
    printf("以先序遍历方式输入二叉树\n");
    printf("注意'#'用于表示空结点\n");
    CreateBiTree(t);
    printf("-----前序遍历二叉树-----\n");
    PreOrderTraverse(t, level);
    printf("-----中序遍历二叉树-----\n");
    InOrderTraverse(t, level);
    printf("-----后序遍历二叉树-----\n");
    PostOrderTraverse(t, level);
    return 0;
}

非递归实现三种遍历

#include <iostream>
#include <cstdio>
using namespace std;
#define OK 1
#define ERROR 0
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct node{
    char data;
    struct node *lchild;
    struct node *rchild;
}BiTNode, *BiTree;
typedef int status;
typedef BiTree SElemType;
typedef struct{
    SElemType * base;
    SElemType * top;
    int stacksize;
}SqStack;
status InitStack(SqStack &s){
    s.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
    s.top = s.base;
    s.stacksize = STACK_INIT_SIZE;
    return OK;
}
status GetTop(SqStack s, SElemType &e){
    if (s.top == s.base) return ERROR;
    e = * (s.top - 1);
    return OK;
}
status Push(SqStack &s, SElemType e){
    if (s.top - s.base >= s.stacksize){
        s.base = (SElemType *)realloc(s.base, (s.stacksize + STACKINCREMENT) * sizeof(SElemType));
        s.top = s.base + s.stacksize;
        s.stacksize += STACKINCREMENT;
    }
    * s.top++ = e;
    return OK;
}
status Pop(SqStack &s, SElemType &e){
    if (s.top == s.base) return ERROR;
    e = * --s.top;
    return OK;
}
status StackEmpty(SqStack s){
    if (s.top != s.base) return ERROR;
    return OK;
}
void CreateBiTree(BiTree &T){
    char ch;
    scanf("%c", &ch);
    if (ch == '*') T = NULL;
    else {
        T = (BiTree)malloc(sizeof(BiTNode));
        T->data = ch;
        CreateBiTree(T->lchild);
        CreateBiTree(T->rchild);
    }
}
void Non_Recursive_PreOrderTraverse(BiTree t){
    SqStack s;
    InitStack(s);
    BiTree p = t;
    while (!StackEmpty(s) || p){
        if (p){
            Push(s, p);
            printf("%c", p->data);
            p = p->lchild;
        }
        else {
            Pop(s, p);
            p = p->rchild;
        }
    }
}
void Non_Recursive_InOrderTraverse(BiTree t){
    SqStack s;
    InitStack(s);
    BiTree p = t;
    while (!StackEmpty(s) || p){
        if (p){
            Push(s, p);
            p = p->lchild;
        }
        else {
            Pop(s, p);
            printf("%c", p->data);
            p = p->rchild;
        }
    }
}
void Non_Recursive_PostOrderTraverse(BiTree t){
    SqStack s;
    InitStack(s);
    BiTree p = t, cur = NULL;
    Push(s, p);
    while (!StackEmpty(s)){
        GetTop(s, p);
        if ((p->lchild == NULL && p->rchild == NULL)
            || (cur == p->lchild || cur == p->rchild)){
            printf("%c", p->data);
            Pop(s, p);
            cur = p;
        }
        else {
            if (p->rchild != NULL) Push(s, p->rchild);
            if (p->lchild != NULL) Push(s, p->lchild);
        }
    }
}
int main(){
    BiTree t;
    printf("以先序遍历方式输入二叉树\n");
    printf("注意'*'用于表示空结点\n");
    CreateBiTree(t);
    printf("-----先序非递归遍历-----\n");
    Non_Recursive_PreOrderTraverse(t);
    printf("\n-----中序非递归遍历-----\n");
    Non_Recursive_InOrderTraverse(t);
    printf("\n-----后序非递归遍历-----\n");
    Non_Recursive_PostOrderTraverse(t);
    printf("\n");
    return 0;
}

相关资料
https://www.cnblogs.com/lanhaicode/p/10358736.html
https://www.cnblogs.com/lanhaicode/p/10390147.html
https://blog.csdn.net/dream0130__/article/details/80779486
https://www.cnblogs.com/masker99/articles/10703257.html
https://blog.csdn.net/zhangxiangDavaid/article/details/37115355
https://blog.csdn.net/lihongzhihhh/article/details/80034254
https://blog.csdn.net/czy47/article/details/81254984

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值