数据结构后序遍历完全二叉树

数据结构后序遍历完全二叉树

题目: 先创建一棵拥有n(>10)个节点的完全二叉树,然后分别利用递归算法和非递归算法后序遍历这棵二叉树,两次遍历的结果要相同。

题目讲解

  1. 题目主要是要求用两种方法来遍历这颗二叉树,其实递归的的很简单,用数组解决就行了,主要是这个非递归的,有点麻烦,用数组写不出来,只好换上了老师的方法,
  2. 然后老师的那种方法的缺点主要是要自己把数把树输进去,不能像数组那么简单,直接输入,比较简单。
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 1024
#define OK              1
#define ERROR           0
int tree[1024];
typedef int ElemType;
typedef int Status;

typedef struct BTNode {
    ElemType    data;
    struct BTNode *lchild,*rchild;
} BTree;

typedef struct St {
    struct BTNode*    data[MaxSize];
    int               top;
} Stack;
//1.按先序次序生成二叉树
BTree* CreateT() {
    BTree *BT;
    ElemType ch;
    scanf("%d",&ch);
    if(ch==0)
        BT=NULL;
    else {
        BT=(BTree*)malloc(sizeof(BTree));
        if(!BT) {
            exit(0);
        }
        BT->data=ch;
        BT->lchild=CreateT();
        BT->rchild=CreateT();
    }
    return BT;
}

//4.后序遍历-非递归
Status PostOrder2(BTree *BT) {
    Stack s,s2;
    BTree *T;
    int flag[MaxSize];
    s.top=0;
    T=BT;
    while(s.top!=0||T) {
        while(T) {
            s.data[s.top++]=T;
            flag[s.top-1]=0;
            T=T->lchild;
        }
        while(s.top!=0&&flag[s.top-1]==1) {
            T=s.data[--s.top];
            printf("%3d",T->data);
        }
        if(s.top!=0) {
            flag[s.top-1]=1;
            T=s.data[s.top-1];
            T=T->rchild;
        } else
            break;
    }
    return OK;
}
void PostTravel1(int *arr,int parentindex,int len) {
    if(parentindex<=len) {
        PostTravel1(arr,parentindex*2,len);
        PostTravel1(arr,parentindex*2+1,len);
        printf("%d ",parentindex);
    }
}

int main() {
    printf("请输入0或者1,选择递归遍历或者非递归遍历:       ");
    int n;
    scanf("%d",&n);
    if(n==0) {
        int jiedian,i;
        printf("请输入一个节点大于10的树:\n");
        scanf("%d",&jiedian);
        for(i=0; i<jiedian; i++)
            tree[i]=i+1;
        PostTravel1(tree,1,jiedian);
        printf("\n后序遍历完成!\n");
    }

    else {
        BTree *BT;
        BT=CreateT();
        if(PostOrder2(BT)) {
            printf("\n非递归后序遍历完成!\n");
        }
    }

}


后面的话我看看能不能不用老师讲的方法写,自己来写一个用数组的,这样子比较简单!
后续还会更新的,请不要直接抄袭代码哦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值