数据结构

zjian1425 2017-10-18 10:15:56
我想定义一个栈去储存放二叉链表的结点:
typedef struct BiTNode{
TElemtype data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

typedef struct{
BiTNode *elem;
int base;
int top;
}Stack;
这样定义可行么?
...全文
316 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
自信男孩 2017-10-20
  • 打赏
  • 举报
回复
引用 11 楼 zj19941201 的回复:
[quote=引用 9 楼 cfjtaishan 的回复:]
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>

typedef int TElemtype;

typedef struct BiTNode {
    TElemtype data;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

typedef struct {
    BiTNode *elem;
    int base;
    int top;
}Stack;

void initstack(Stack &S)
{
    S.elem = (BiTNode *)malloc(20*sizeof(BiTNode));
    if (!S.elem) {
        fprintf(stderr, "malloc error!\n");
        exit(1);
    }
    S.base = S.top = 0;
}

void push(Stack &S,BiTree T)
{
    memcpy(S.elem+S.top, T, sizeof(BiTNode));
    //S.elem[S.top] = T;
    ++S.top;
}
BiTNode pop (Stack &S)
{
    return S.elem[--S.top];
}

#if 0
void pref(BiTree &T,Stack &S)
{
    BiTNode p = *T;

    while(p!=NULL|| (S.top!=S.base))
    {
        if(p!=NULL){
            printf("%d", p->data);
            push(S,p);
            p = p->lchild;
        }else{
            p = pop(S);
            p = T->rchild;
        }
    }
}
#endif
int main()
{
    Stack S;
    initstack(S);
    return 0;
}
栈申请没什么问题。
说错了,就是卡在你改的这一步,
memcpy(S.elem+S.top, T, sizeof(BiTNode));
    //S.elem[S.top] = T;
报错:[Error] no match for 'operator=' in '*(S.Stack::elem + ((sizetype)(((long long unsigned int)S.Stack::top) * 24ull))) = T' [/quote] 如果不改呢?会有问题吗?
zjian1425 2017-10-20
  • 打赏
  • 举报
回复
引用 12 楼 cfjtaishan 的回复:
[quote=引用 11 楼 zj19941201 的回复:] [quote=引用 9 楼 cfjtaishan 的回复:]
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>

typedef int TElemtype;

typedef struct BiTNode {
    TElemtype data;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

typedef struct {
    BiTNode *elem;
    int base;
    int top;
}Stack;

void initstack(Stack &S)
{
    S.elem = (BiTNode *)malloc(20*sizeof(BiTNode));
    if (!S.elem) {
        fprintf(stderr, "malloc error!\n");
        exit(1);
    }
    S.base = S.top = 0;
}

void push(Stack &S,BiTree T)
{
    memcpy(S.elem+S.top, T, sizeof(BiTNode));
    //S.elem[S.top] = T;
    ++S.top;
}
BiTNode pop (Stack &S)
{
    return S.elem[--S.top];
}

#if 0
void pref(BiTree &T,Stack &S)
{
    BiTNode p = *T;

    while(p!=NULL|| (S.top!=S.base))
    {
        if(p!=NULL){
            printf("%d", p->data);
            push(S,p);
            p = p->lchild;
        }else{
            p = pop(S);
            p = T->rchild;
        }
    }
}
#endif
int main()
{
    Stack S;
    initstack(S);
    return 0;
}
栈申请没什么问题。
说错了,就是卡在你改的这一步,
memcpy(S.elem+S.top, T, sizeof(BiTNode));
    //S.elem[S.top] = T;
报错:[Error] no match for 'operator=' in '*(S.Stack::elem + ((sizetype)(((long long unsigned int)S.Stack::top) * 24ull))) = T' [/quote] 如果不改呢?会有问题吗?[/quote] 不改的话,在编译时就会报错报错 :[Error] no match for 'operator=' in '*(S.Stack::elem + ((sizetype)(((long long unsigned int)S.Stack::top) * 24ull))) = T' 我看不懂这个报错什么意思啊,你改的哪一步是什么啊,能不能解释一下啊,谢谢。
赵4老师 2017-10-19
  • 打赏
  • 举报
回复
仅供参考:
#include <iostream>
#include <stack>
#include <queue>
#include <locale.h>
using namespace std;
typedef struct BiTNode {//二叉树结点
    char data;                      //数据
    struct BiTNode *lchild,*rchild; //左右孩子指针
} BiTNode,*BiTree;
int CreateBiTree(BiTree &T) {//按先序序列创建二叉树
    char data;
    scanf("%c",&data);//按先序次序输入二叉树中结点的值(一个字符),‘#’表示空树
    if (data == '#') {
        T = NULL;
    } else {
        T = (BiTree)malloc(sizeof(BiTNode));
        T->data = data;         //生成根结点
        CreateBiTree(T->lchild);//构造左子树
        CreateBiTree(T->rchild);//构造右子树
    }
    return 0;
}
void Visit(BiTree T) {//输出
    if (T->data != '#') {
        printf("%c ",T->data);
    }
}
void PreOrder(BiTree T) {//先序遍历
    if (T != NULL) {
        Visit(T);               //访问根节点
        PreOrder(T->lchild);    //访问左子结点
        PreOrder(T->rchild);    //访问右子结点
    }
}
void InOrder(BiTree T) {//中序遍历
    if (T != NULL) {
        InOrder(T->lchild);     //访问左子结点
        Visit(T);               //访问根节点
        InOrder(T->rchild);     //访问右子结点
    }
}
void PostOrder(BiTree T) {//后序遍历
    if (T != NULL) {
        PostOrder(T->lchild);   //访问左子结点
        PostOrder(T->rchild);   //访问右子结点
        Visit(T);               //访问根节点
    }
}
void PreOrder2(BiTree T) {//先序遍历(非递归)
//访问T->data后,将T入栈,遍历左子树;遍历完左子树返回时,栈顶元素应为T,出栈,再先序遍历T的右子树。
    stack<BiTree> stack;
    BiTree p = T;//p是遍历指针
    while (p || !stack.empty()) {   //栈不空或者p不空时循环
        if (p != NULL) {
            stack.push(p);          //存入栈中
            printf("%c ",p->data);  //访问根节点
            p = p->lchild;          //遍历左子树
        } else {
            p = stack.top();        //退栈
            stack.pop();
            p = p->rchild;          //访问右子树
        }
    }
}
void InOrder2(BiTree T) {//中序遍历(非递归)
//T是要遍历树的根指针,中序遍历要求在遍历完左子树后,访问根,再遍历右子树。
//先将T入栈,遍历左子树;遍历完左子树返回时,栈顶元素应为T,出栈,访问T->data,再中序遍历T的右子树。
    stack<BiTree> stack;
    BiTree p = T;//p是遍历指针
    while (p || !stack.empty()) {   //栈不空或者p不空时循环
        if (p != NULL) {
            stack.push(p);          //存入栈中
            p = p->lchild;          //遍历左子树
        } else {
            p = stack.top();        //退栈,访问根节点
            printf("%c ",p->data);
            stack.pop();
            p = p->rchild;          //访问右子树
        }
    }
}

typedef struct BiTNodePost{
    BiTree biTree;
    char tag;
} BiTNodePost,*BiTreePost;
void PostOrder2(BiTree T) {//后序遍历(非递归)
    stack<BiTreePost> stack;
    BiTree p = T;//p是遍历指针
    BiTreePost BT;
    while (p != NULL || !stack.empty()) {//栈不空或者p不空时循环
        while (p != NULL) {//遍历左子树
            BT = (BiTreePost)malloc(sizeof(BiTNodePost));
            BT->biTree = p;
            BT->tag = 'L';//访问过左子树
            stack.push(BT);
            p = p->lchild;
        }
        while (!stack.empty() && (stack.top())->tag == 'R') {//左右子树访问完毕访问根节点
            BT = stack.top();
            stack.pop();//退栈
            printf("%c ",BT->biTree->data);
        }
        if (!stack.empty()) {//遍历右子树
            BT = stack.top();
            BT->tag = 'R';//访问过右子树
            p = BT->biTree;
            p = p->rchild;
        }
    }
}

void LevelOrder(BiTree T) {//层次遍历
    if (T == NULL) return;
    BiTree p = T;
    queue<BiTree> queue;//队列
    queue.push(p);//根节点入队
    while (!queue.empty()) {    //队列不空循环
        p = queue.front();      //对头元素出队
        printf("%c ",p->data);  //访问p指向的结点
        queue.pop();            //退出队列
        if (p->lchild != NULL) {//左子树不空,将左子树入队
            queue.push(p->lchild);
        }
        if (p->rchild != NULL) {//右子树不空,将右子树入队
            queue.push(p->rchild);
        }
    }
}
int main() {
    BiTree T;

    setlocale(LC_ALL,"chs");
    CreateBiTree(T);

    printf("先序遍历        :");PreOrder  (T);printf("\n");
    printf("先序遍历(非递归):");PreOrder2 (T);printf("\n");
                                               printf("\n");
    printf("中序遍历        :");InOrder   (T);printf("\n");
    printf("中序遍历(非递归):");InOrder2  (T);printf("\n");
                                               printf("\n");
    printf("后序遍历        :");PostOrder (T);printf("\n");
    printf("后序遍历(非递归):");PostOrder2(T);printf("\n");
                                               printf("\n");
    printf("层次遍历        :");LevelOrder(T);printf("\n");

    return 0;
}
//ABC##DE#G##F###
//先序遍历        :A B C D E G F
//先序遍历(非递归):A B C D E G F
//
//中序遍历        :C B E G D F A
//中序遍历(非递归):C B E G D F A
//
//后序遍历        :C G E F D B A
//后序遍历(非递归):C G E F D B A
//
//层次遍历        :A B C D E F G
//

///       A
///      /
///     B
///    / \
///   C   D
///      / \
///     E   F
///      \
///       G
自信男孩 2017-10-19
  • 打赏
  • 举报
回复
这样定义是没问题,主要是实现。
typedef struct BiTNode{
    TElemtype data;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

typedef struct{
    BiTNode *elem;
    int base;
    int top;
}Stack
zjian1425 2017-10-19
  • 打赏
  • 举报
回复
引用 9 楼 cfjtaishan 的回复:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>

typedef int TElemtype;

typedef struct BiTNode {
    TElemtype data;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

typedef struct {
    BiTNode *elem;
    int base;
    int top;
}Stack;

void initstack(Stack &S)
{
    S.elem = (BiTNode *)malloc(20*sizeof(BiTNode));
    if (!S.elem) {
        fprintf(stderr, "malloc error!\n");
        exit(1);
    }
    S.base = S.top = 0;
}

void push(Stack &S,BiTree T)
{
    memcpy(S.elem+S.top, T, sizeof(BiTNode));
    //S.elem[S.top] = T;
    ++S.top;
}
BiTNode pop (Stack &S)
{
    return S.elem[--S.top];
}

#if 0
void pref(BiTree &T,Stack &S)
{
    BiTNode p = *T;

    while(p!=NULL|| (S.top!=S.base))
    {
        if(p!=NULL){
            printf("%d", p->data);
            push(S,p);
            p = p->lchild;
        }else{
            p = pop(S);
            p = T->rchild;
        }
    }
}
#endif
int main()
{
    Stack S;
    initstack(S);
    return 0;
}
栈申请没什么问题。
说错了,就是卡在你改的这一步,
memcpy(S.elem+S.top, T, sizeof(BiTNode));
    //S.elem[S.top] = T;
报错:[Error] no match for 'operator=' in '*(S.Stack::elem + ((sizetype)(((long long unsigned int)S.Stack::top) * 24ull))) = T'
zjian1425 2017-10-19
  • 打赏
  • 举报
回复
memcpy(S.elem+S.top, T, sizeof(BiTNode));
    //S.elem[S.top] = T;
说错了,就是卡在你改的这一步,报错:[Error] no match for 'operator=' in '*(S.Stack::elem + ((sizetype)(((long long unsigned int)S.Stack::top) * 24ull))) = T'
自信男孩 2017-10-19
  • 打赏
  • 举报
回复
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>

typedef int TElemtype;

typedef struct BiTNode {
    TElemtype data;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

typedef struct {
    BiTNode *elem;
    int base;
    int top;
}Stack;

void initstack(Stack &S)
{
    S.elem = (BiTNode *)malloc(20*sizeof(BiTNode));
    if (!S.elem) {
        fprintf(stderr, "malloc error!\n");
        exit(1);
    }
    S.base = S.top = 0;
}

void push(Stack &S,BiTree T)
{
    memcpy(S.elem+S.top, T, sizeof(BiTNode));
    //S.elem[S.top] = T;
    ++S.top;
}
BiTNode pop (Stack &S)
{
    return S.elem[--S.top];
}

#if 0
void pref(BiTree &T,Stack &S)
{
    BiTNode p = *T;

    while(p!=NULL|| (S.top!=S.base))
    {
        if(p!=NULL){
            printf("%d", p->data);
            push(S,p);
            p = p->lchild;
        }else{
            p = pop(S);
            p = T->rchild;
        }
    }
}
#endif
int main()
{
    Stack S;
    initstack(S);
    return 0;
}
栈申请没什么问题。
zjian1425 2017-10-19
  • 打赏
  • 举报
回复
引用 5 楼 zhao4zhong1 的回复:
再供参考:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <graphics.h>
int xs[10000];
int ys[10000];
int i=0,xx,yy;
int fc,bc;
void push(int x,int y) {
	xs[i]=x;
	ys[i]=y;
	if (i<10000-1) {
		i=i+1;
	} else {
		printf("stack overflow!\n");
		exit(1);
	}
}
void pop(void) {
	i=i-1;
	xx=xs[i];
	yy=ys[i];
}
int check(int x,int y) {
	int	c;

	c=getpixel(x,y); /*	获取当前点的颜色 */
	return ((c!=bc)&&(c!=fc));/* 如果颜色为边界色或填充色则不填充 */
}
void seedfilling(int x,int y,int fill_color,int boundary_color) {
	fc=fill_color;
	bc=boundary_color;
	push(x,y);
	while (1) {
		if (i<=0) return;
		pop();
		if (check(xx,yy)) {
			putpixel(xx, yy, 14);getch();  /* 加上这行显示当前填充状态 */

			putpixel(xx, yy, fill_color); /* 画点 */

			if (check(xx-1,yy  )) push(xx-1,yy	);
			if (check(xx  ,yy+1)) push(xx  ,yy+1);
			if (check(xx  ,yy-1)) push(xx  ,yy-1);
			if (check(xx+1,yy  )) push(xx+1,yy	);
			/* 去掉下面四句就是四连通 */
			if (check(xx-1,yy-1)) push(xx-1,yy-1);
			if (check(xx-1,yy+1)) push(xx-1,yy+1);
			if (check(xx+1,yy-1)) push(xx+1,yy-1);
			if (check(xx+1,yy+1)) push(xx+1,yy+1);
        }
    }
}
void main() {
    int a,b,color;
    int gdriver = DETECT, gmode, errorcode;
    int poly[10];

	initgraph(&gdriver,	&gmode,	"d:\\bc\\bgi");
    a=150;
    b=140;
    color=4;
    poly[0]=110;/* 第一个点的x坐标以及y坐标 */
    poly[1]=110;
    poly[2]=200;/* 第二点 */
    poly[3]=105;
    poly[4]=170;/* 第三点 */
    poly[5]=120;
    poly[6]=150;/* 第四点 */
    poly[7]=170;
    poly[8]=110;/* 多边形的起点与终点一样 */
    poly[9]=110;
    drawpoly(5,poly);/* 显示各点连接起来的多边形 */

    /* 保证边界对八连通是封闭的 */
    setviewport(0,1,600,300,0);
    drawpoly(5,poly);/* 显示各点连接起来的多边形 */
    setviewport(1,0,600,300,0);
    drawpoly(5,poly);/* 显示各点连接起来的多边形 */
    setviewport(1,1,600,300,0);
    drawpoly(5,poly);/* 显示各点连接起来的多边形 */

    /* 恢复默认viewport */
    setviewport(0,0,600,300,0);

    seedfilling(a,b,color,15);  /* 种子填充多边形 */

    getch();
    closegraph();
}
老师,我就是对结点这个东西理解有点困惑,我想把结点放进栈,难以实现。把整形和字符类型的这些类型放进栈我自己可以实现。如果说把二叉树的节点放进栈内是不是相当于把这个节点的地址放进了栈内啊。
zjian1425 2017-10-19
  • 打赏
  • 举报
回复
引用 6 楼 cfjtaishan 的回复:
[quote=引用 4 楼 zj19941201 的回复:] [quote=引用 1 楼 cfjtaishan 的回复:] 这样定义是没问题,主要是实现。
typedef struct BiTNode{
    TElemtype data;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

typedef struct{
    BiTNode *elem;
    int base;
    int top;
}Stack
我在申请空间的时候就报错了,我不知道是哪里出了问题,还是传参的时候错了?[/quote] 贴出你的代码,看一下是哪儿出了问题。[/quote] 好的! typedef int TElemtype; typedef struct BiTNode{ TElemtype data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; typedef struct{ BiTNode *elem; int base; int top; }Stack; void initstack(Stack &S) { S.elem = (BiTNode *)malloc(20*sizeof(BiTNode)); S.base=S.top=0; } void push(Stack &S,BiTree T) { S.elem[S.top]=T; ++S.top; } BiTNode pop (Stack &S) { return *S.elem[--S.top]; } void pref(BiTree &T,Stack &S) { BiTree *p; while(p!=NULL|| (S.top!=S.base)) { if(p!=NULL){ printf("%d",p->data); push(S,p); p=p->lchild; }else{ p=pop(S); p=T->rchild; } } } int main() { Stack S; initsatck(S); return 0; }
自信男孩 2017-10-19
  • 打赏
  • 举报
回复
引用 4 楼 zj19941201 的回复:
[quote=引用 1 楼 cfjtaishan 的回复:] 这样定义是没问题,主要是实现。
typedef struct BiTNode{
    TElemtype data;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

typedef struct{
    BiTNode *elem;
    int base;
    int top;
}Stack
我在申请空间的时候就报错了,我不知道是哪里出了问题,还是传参的时候错了?[/quote] 贴出你的代码,看一下是哪儿出了问题。
赵4老师 2017-10-19
  • 打赏
  • 举报
回复
再供参考:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <graphics.h>
int xs[10000];
int ys[10000];
int i=0,xx,yy;
int fc,bc;
void push(int x,int y) {
	xs[i]=x;
	ys[i]=y;
	if (i<10000-1) {
		i=i+1;
	} else {
		printf("stack overflow!\n");
		exit(1);
	}
}
void pop(void) {
	i=i-1;
	xx=xs[i];
	yy=ys[i];
}
int check(int x,int y) {
	int	c;

	c=getpixel(x,y); /*	获取当前点的颜色 */
	return ((c!=bc)&&(c!=fc));/* 如果颜色为边界色或填充色则不填充 */
}
void seedfilling(int x,int y,int fill_color,int boundary_color) {
	fc=fill_color;
	bc=boundary_color;
	push(x,y);
	while (1) {
		if (i<=0) return;
		pop();
		if (check(xx,yy)) {
			putpixel(xx, yy, 14);getch();  /* 加上这行显示当前填充状态 */

			putpixel(xx, yy, fill_color); /* 画点 */

			if (check(xx-1,yy  )) push(xx-1,yy	);
			if (check(xx  ,yy+1)) push(xx  ,yy+1);
			if (check(xx  ,yy-1)) push(xx  ,yy-1);
			if (check(xx+1,yy  )) push(xx+1,yy	);
			/* 去掉下面四句就是四连通 */
			if (check(xx-1,yy-1)) push(xx-1,yy-1);
			if (check(xx-1,yy+1)) push(xx-1,yy+1);
			if (check(xx+1,yy-1)) push(xx+1,yy-1);
			if (check(xx+1,yy+1)) push(xx+1,yy+1);
        }
    }
}
void main() {
    int a,b,color;
    int gdriver = DETECT, gmode, errorcode;
    int poly[10];

	initgraph(&gdriver,	&gmode,	"d:\\bc\\bgi");
    a=150;
    b=140;
    color=4;
    poly[0]=110;/* 第一个点的x坐标以及y坐标 */
    poly[1]=110;
    poly[2]=200;/* 第二点 */
    poly[3]=105;
    poly[4]=170;/* 第三点 */
    poly[5]=120;
    poly[6]=150;/* 第四点 */
    poly[7]=170;
    poly[8]=110;/* 多边形的起点与终点一样 */
    poly[9]=110;
    drawpoly(5,poly);/* 显示各点连接起来的多边形 */

    /* 保证边界对八连通是封闭的 */
    setviewport(0,1,600,300,0);
    drawpoly(5,poly);/* 显示各点连接起来的多边形 */
    setviewport(1,0,600,300,0);
    drawpoly(5,poly);/* 显示各点连接起来的多边形 */
    setviewport(1,1,600,300,0);
    drawpoly(5,poly);/* 显示各点连接起来的多边形 */

    /* 恢复默认viewport */
    setviewport(0,0,600,300,0);

    seedfilling(a,b,color,15);  /* 种子填充多边形 */

    getch();
    closegraph();
}
zjian1425 2017-10-19
  • 打赏
  • 举报
回复
引用 1 楼 cfjtaishan 的回复:
这样定义是没问题,主要是实现。
typedef struct BiTNode{
    TElemtype data;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

typedef struct{
    BiTNode *elem;
    int base;
    int top;
}Stack
我在申请空间的时候就报错了,我不知道是哪里出了问题,还是传参的时候错了?
zjian1425 2017-10-19
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
仅供参考:
#include <iostream>
#include <stack>
#include <queue>
#include <locale.h>
using namespace std;
typedef struct BiTNode {//二叉树结点
    char data;                      //数据
    struct BiTNode *lchild,*rchild; //左右孩子指针
} BiTNode,*BiTree;
int CreateBiTree(BiTree &T) {//按先序序列创建二叉树
    char data;
    scanf("%c",&data);//按先序次序输入二叉树中结点的值(一个字符),‘#’表示空树
    if (data == '#') {
        T = NULL;
    } else {
        T = (BiTree)malloc(sizeof(BiTNode));
        T->data = data;         //生成根结点
        CreateBiTree(T->lchild);//构造左子树
        CreateBiTree(T->rchild);//构造右子树
    }
    return 0;
}
void Visit(BiTree T) {//输出
    if (T->data != '#') {
        printf("%c ",T->data);
    }
}
void PreOrder(BiTree T) {//先序遍历
    if (T != NULL) {
        Visit(T);               //访问根节点
        PreOrder(T->lchild);    //访问左子结点
        PreOrder(T->rchild);    //访问右子结点
    }
}
void InOrder(BiTree T) {//中序遍历
    if (T != NULL) {
        InOrder(T->lchild);     //访问左子结点
        Visit(T);               //访问根节点
        InOrder(T->rchild);     //访问右子结点
    }
}
void PostOrder(BiTree T) {//后序遍历
    if (T != NULL) {
        PostOrder(T->lchild);   //访问左子结点
        PostOrder(T->rchild);   //访问右子结点
        Visit(T);               //访问根节点
    }
}
void PreOrder2(BiTree T) {//先序遍历(非递归)
//访问T->data后,将T入栈,遍历左子树;遍历完左子树返回时,栈顶元素应为T,出栈,再先序遍历T的右子树。
    stack<BiTree> stack;
    BiTree p = T;//p是遍历指针
    while (p || !stack.empty()) {   //栈不空或者p不空时循环
        if (p != NULL) {
            stack.push(p);          //存入栈中
            printf("%c ",p->data);  //访问根节点
            p = p->lchild;          //遍历左子树
        } else {
            p = stack.top();        //退栈
            stack.pop();
            p = p->rchild;          //访问右子树
        }
    }
}
void InOrder2(BiTree T) {//中序遍历(非递归)
//T是要遍历树的根指针,中序遍历要求在遍历完左子树后,访问根,再遍历右子树。
//先将T入栈,遍历左子树;遍历完左子树返回时,栈顶元素应为T,出栈,访问T->data,再中序遍历T的右子树。
    stack<BiTree> stack;
    BiTree p = T;//p是遍历指针
    while (p || !stack.empty()) {   //栈不空或者p不空时循环
        if (p != NULL) {
            stack.push(p);          //存入栈中
            p = p->lchild;          //遍历左子树
        } else {
            p = stack.top();        //退栈,访问根节点
            printf("%c ",p->data);
            stack.pop();
            p = p->rchild;          //访问右子树
        }
    }
}

typedef struct BiTNodePost{
    BiTree biTree;
    char tag;
} BiTNodePost,*BiTreePost;
void PostOrder2(BiTree T) {//后序遍历(非递归)
    stack<BiTreePost> stack;
    BiTree p = T;//p是遍历指针
    BiTreePost BT;
    while (p != NULL || !stack.empty()) {//栈不空或者p不空时循环
        while (p != NULL) {//遍历左子树
            BT = (BiTreePost)malloc(sizeof(BiTNodePost));
            BT->biTree = p;
            BT->tag = 'L';//访问过左子树
            stack.push(BT);
            p = p->lchild;
        }
        while (!stack.empty() && (stack.top())->tag == 'R') {//左右子树访问完毕访问根节点
            BT = stack.top();
            stack.pop();//退栈
            printf("%c ",BT->biTree->data);
        }
        if (!stack.empty()) {//遍历右子树
            BT = stack.top();
            BT->tag = 'R';//访问过右子树
            p = BT->biTree;
            p = p->rchild;
        }
    }
}

void LevelOrder(BiTree T) {//层次遍历
    if (T == NULL) return;
    BiTree p = T;
    queue<BiTree> queue;//队列
    queue.push(p);//根节点入队
    while (!queue.empty()) {    //队列不空循环
        p = queue.front();      //对头元素出队
        printf("%c ",p->data);  //访问p指向的结点
        queue.pop();            //退出队列
        if (p->lchild != NULL) {//左子树不空,将左子树入队
            queue.push(p->lchild);
        }
        if (p->rchild != NULL) {//右子树不空,将右子树入队
            queue.push(p->rchild);
        }
    }
}
int main() {
    BiTree T;

    setlocale(LC_ALL,"chs");
    CreateBiTree(T);

    printf("先序遍历        :");PreOrder  (T);printf("\n");
    printf("先序遍历(非递归):");PreOrder2 (T);printf("\n");
                                               printf("\n");
    printf("中序遍历        :");InOrder   (T);printf("\n");
    printf("中序遍历(非递归):");InOrder2  (T);printf("\n");
                                               printf("\n");
    printf("后序遍历        :");PostOrder (T);printf("\n");
    printf("后序遍历(非递归):");PostOrder2(T);printf("\n");
                                               printf("\n");
    printf("层次遍历        :");LevelOrder(T);printf("\n");

    return 0;
}
//ABC##DE#G##F###
//先序遍历        :A B C D E G F
//先序遍历(非递归):A B C D E G F
//
//中序遍历        :C B E G D F A
//中序遍历(非递归):C B E G D F A
//
//后序遍历        :C G E F D B A
//后序遍历(非递归):C G E F D B A
//
//层次遍历        :A B C D E F G
//

///       A
///      /
///     B
///    / \
///   C   D
///      / \
///     E   F
///      \
///       G
老师我想说的是我想造个轮子,您这段代码这个栈是头文件里提供的,我去查看了头文件我现在这水平还看不懂啊。

69,335

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧