【数据结构】算法6.1-6.4 遍历二叉树
来源:互联网 发布:淘宝理财官网 编辑:程序博客网 时间:2024/05/21 00:50
#include<stdio.h>#include<stdlib.h>#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2#define SIZE 100typedef int Status;typedef char TElemType;typedef char SElemType;typedef struct BiTNode{ TElemType data; struct BiTNode *lchild,*rchild; //左孩子右孩子指针}BiTNode,*BiTree,*Position;typedef struct SNode{ BiTree data; struct SNode *next;}SNode;typedef struct{ SNode *base; //在栈构造之前和销毁之后,base的值为NULL SNode *top; //栈顶指针}SqStack;/*******************************声明部分****************************************/Status InitStack(SqStack *S);//初始化栈Status Pop(SqStack *S,BiTree *e);//删除栈顶元素,并用e返回栈顶元素Status InitBiTree(BiTree *T);//构造二叉树Status Push(SqStack *S,BiTree e);//将元素e压入栈Status StackEmpty(SqStack S);//判断是否栈空Status GetTop(SqStack *S,BiTree *e);//取栈顶元素,用e返回Status InitBiTree(BiTree *T);//构造空二叉树Status BiTreeEmpty(BiTree T);//若二叉树T为空,则返回TRUE,否则FALSETElemType Root(BiTree T);//返回T的根Status CreateBiTree(BiTree *T);//按先次序输入二叉树中结点的值(一个字符),空格字符表示空树,//构造二叉链表表示的二叉树TStatus Visit(TElemType e);Status PreOrderTraverse(BiTree T,Status(*Visit)(TElemType e)); //递归;//采用二叉链表存储结构,先序遍历二叉树T的递归算法Status InOrderTraverse_1(BiTree T); //非递归;//采用二叉链表存储结构,中序遍历二叉树T的递归算法Status InOrderTraverse_2(BiTree T); //非递归;//采用二叉链表存储结构,中序遍历二叉树T的递归算法/*******************************函数部分****************************************/Status InitStack(SqStack *S){ S->top = S->base = NULL; return OK;}Status Pop(SqStack *S,BiTree *e){ if(S->top == S->base) return ERROR; SNode *p = S->top; S->top = S->top->next; *e = p->data; free(p); return OK;}Status Push(SqStack *S,BiTree e){ SNode *p = (SNode*)malloc(sizeof(SNode)); if(!p) exit(OVERFLOW); p->data = e; p->next = S->top; S->top = p; return OK;}Status StackEmpty(SqStack S){ return S.base==S.top;}Status GetTop(SqStack *S,BiTree *e){ if((*S).top == NULL) return ERROR; *e = (*S).top->data; return OK;}Status InitBiTree(BiTree *T){ *T = NULL; return OK;}Status BiTreeEmpty(BiTree T){ return T==NULL;}Status BiTreeDepth(BiTree T){ int L,R; if(T){ L = BiTreeDepth(T->lchild); R = BiTreeDepth(T->rchild); return(L > R ? L:R)+1; } return 0;}TElemType Root(BiTree T){ return T->data;}Status CreateBiTree(BiTree *T){ TElemType ch; // scanf("%c",&ch); ch = getchar(); if(ch == ' ') *T = NULL; else{ *T = (BiTree)malloc(sizeof(BiTNode)); if(!(*T)) exit(OVERFLOW); (*T)->data = ch; //生成根结点 CreateBiTree(&(*T)->lchild); //构造左子树 CreateBiTree(&(*T)->rchild); //构造右子树 } return OK;}Status Visit(TElemType e){ printf("%c\t",e); return OK;}Status PreOrderTraverse(BiTree T,Status(*Visit)(TElemType e)) //递归{ if(T){ if(Visit(T->data)) if(PreOrderTraverse(T->lchild,Visit)) if(PreOrderTraverse(T->rchild,Visit)) return OK; return ERROR; } else return OK;}Status InOrderTraverse_1(BiTree T) //非递归{ SqStack S; BiTNode *p; InitStack(&S); Push(&S,T); //根指针进栈 while(!StackEmpty(S)){ while(GetTop(&S,&p) && p) Push(&S,p->lchild); //向左走到尽头 Pop(&S,&p); //空指针退栈 if(!StackEmpty(S)){ //访问结点,向右一步 Pop(&S,&p); if(!Visit(p->data)) return ERROR; Push(&S,p->rchild); } } return OK;}Status InOrderTraverse_2(BiTree T) //非递归{ SqStack S; BiTNode *p; InitStack(&S); p = T; while(p || !StackEmpty(S)){ if(p){ Push(&S,p); p = p->lchild; //根指针进栈,遍历左子树 } else{ //根指针退栈,访问根结点,遍历右子树 Pop(&S,&p); if(!Visit(p->data)) return ERROR; p = p->rchild; } }//while return OK;}/*******************************主函数部分**************************************/int main(){ BiTree T; InitBiTree(&T); //复制分号前的字符:ABC DE G F ; printf("\n创建二叉树(键入ABC^^DE^G^^F^^^,'^'表示空格):\n"); CreateBiTree(&T); printf("\n\n前序遍历:\n"); PreOrderTraverse(T,Visit); printf("\n\n中序非递归遍历1:\n"); InOrderTraverse_1(T); printf("\n\n中序非递归遍历2:\n"); InOrderTraverse_2(T); printf("\n"); return 0;}
0 0
- 【数据结构】算法6.1-6.4 遍历二叉树
- 问题 H: 数据结构(C语言版)算法6.1至算法6.4__二叉树遍历
- 数据结构与算法之二叉树遍历
- 【数据结构与算法】二叉树广度遍历
- 【数据结构与算法】二叉树的遍历
- 【数据结构与算法】二叉树 遍历
- [数据结构与算法]二叉树与二叉树遍历
- 二叉树遍历 - 数据结构
- 数据结构 二叉树遍历
- 数据结构 - 二叉树遍历
- 二叉树遍历 - 数据结构
- 数据结构--二叉树遍历
- 【数据结构】二叉树遍历
- 数据结构-二叉树遍历
- 数据结构--遍历二叉树
- 数据结构二叉树遍历
- 数据结构二叉树遍历
- 【数据结构与算法】二叉树的遍历(递归遍历、非递归遍历、层序遍历)
- IPC机制第一篇,使用Messenger
- 编程打印空心菱形
- 出差A2
- ContentProvider跨APP读取数据失败
- 如何使导航栏水平居中
- 【数据结构】算法6.1-6.4 遍历二叉树
- 【UVA 10791】最小公倍数的最小和
- Yarn个人总结
- 【神经网络与深度学习】YOLO windows 配置《Darknet配置》
- 【政治学】:一些想法
- PAT(A) - 1087. All Roads Lead to Rome (30)
- 开始博客之旅
- leetcode小白解题记录——第十一题
- bzoj 1076: [SCOI2008]奖励关 期望dp+状态压缩