二叉树前序,中序,后续遍历(递归和非递归)
来源:互联网 发布:苏州十大网络教育机构 编辑:程序博客网 时间:2024/04/30 10:15
一个家庭成员之间的血缘继承关系构成了一颗树,尤其是独生子女的家庭,构成的是一棵二叉树。比如说,每个同学同时继承了爸爸和妈妈的血缘。请同学们以此为背景,以自己为树根,以血缘继承关系为变,生成一棵家庭血缘继承关系二叉树;另外,分别用前序、中序和后序遍历访问家庭成员。
#include <stdio.h>#include <stdlib.h>#include <malloc.h>#include <string.h>#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define OVERFLOW -2#define INITSTACKSIZE 100#define INCREASESIZE 10typedef int Status;typedef char TElemTye;typedef struct BiTNode{TElemTye name[10];struct BiTNode *lchild, *rchild;}BiTNode, *BiTree;typedef struct Stack{BiTree *top, *base;int stacksize;}Stack;Status InitStack(Stack &S){S.stacksize = INITSTACKSIZE;S.base = (BiTree*)malloc(sizeof(BiTNode)*INITSTACKSIZE);if (!S.base)exit(OVERFLOW);S.top = S.base;return OK;}Status StackEmpty(Stack S){if (S.base == S.top)return OK;return FALSE;}Status Push(Stack &S, BiTree a){if (S.top - S.base >= S.stacksize){S.base = (BiTree*)realloc(S.base, INCREASESIZE + S.stacksize);if (!S.base)exit(OVERFLOW);S.stacksize += INCREASESIZE;}*S.top = a;S.top++;return OK;}Status Pop(Stack &S, BiTree &a){if (S.base == S.top)return ERROR;S.top--;a = *S.top;return OK;}BiTree GetTop(Stack S, BiTree a){if (S.base == S.top)return ERROR;a = *--S.top;return a;}Status Stack_Size(Stack S){int n;n = S.top - S.base - 1;return n;}Status CreateBiTree(BiTree &T){char a[10];gets_s(a);if (strlen(a) == 0)T = NULL;else{T = (BiTree)malloc(sizeof(BiTNode));if (!T)return OVERFLOW;strcpy_s(T->name, sizeof(T->name), a);CreateBiTree(T->lchild);CreateBiTree(T->rchild);}return OK;}//递归先序遍历Status RePreOrderTraverse(BiTree &T){if (T){printf("%s\n", T->name);RePreOrderTraverse(T->lchild);RePreOrderTraverse(T->rchild);}return OK;}//非递归先序遍历Status URePreOrderTraverse(BiTree T){Stack S;InitStack(S);BiTree p;p = T;while (!StackEmpty(S) || p){if (p){printf("%s\n", p->name);Push(S, p);p = p->lchild;}else{Pop(S, p);p = p->rchild;}}return OK;}//递归中序遍历Status ReInOrderTraverse(BiTree &T){if (T){RePreOrderTraverse(T->lchild);printf("%s\n", T->name);RePreOrderTraverse(T->rchild);}return OK;}//非递归中序遍历Status UReInOrderTraverse(BiTree T){BiTree p;Stack S;InitStack(S);p = T;while (!StackEmpty(S) || p){if (p){Push(S, p);p = p->lchild;}else{Pop(S, p);printf("%s\n", p->name);p = p->rchild;}}return OK;}//递归后续遍历Status RePostOrderTraverse(BiTree &T){if (T){RePreOrderTraverse(T->lchild);RePreOrderTraverse(T->rchild);printf("%s\n", T->name);}return OK;}//非递归后序遍历Status URePostOrderTraverse(BiTree T){BiTree p;Stack S;InitStack(S);p = T;int Tag[20]; //栈,用于标识从左(0)或右(1)返回 while (p != NULL || !StackEmpty(S)){while (p != NULL){Push(S, p);Tag[Stack_Size(S)] = 0;p = p->lchild;}while (!StackEmpty(S) && Tag[Stack_Size(S)] == 1){Pop(S,p);printf("%s\n", p->name);}if (!StackEmpty(S)){Tag[Stack_Size(S)] = 1; //设置标记右子树已经访问 p = GetTop(S,p);p = p->rchild;}else break;}return OK;}int main(){BiTree T;CreateBiTree(T);printf("递归先序遍历\n");RePreOrderTraverse(T);printf("非递归先序遍历\n");URePreOrderTraverse(T);printf("递归先中序遍历\n");ReInOrderTraverse(T);printf("非递归中序遍历\n");UReInOrderTraverse(T);printf("递归后序遍历\n");RePostOrderTraverse(T);printf("非递归后序遍历\n");URePostOrderTraverse(T);return 0;}
0 0
- 二叉树前序,中序,后续遍历(递归和非递归)
- 二叉树前序遍历和中序遍历及后续遍历非递归
- 二叉树先序、中序、后续遍历(非递归实现)
- 二叉树遍历算法(递归实现先序中序和后续遍历)(非递归实现中序和先续)
- 二叉树的先序、中序、后续遍历的递归和非递归实现
- 二叉树的创建 先序 中序 后续 递归和非递归遍历
- 递归和非递归实现二叉树的后续遍历
- 二叉树的前序遍历、中序遍历、后续遍历 (包括递归、非递归,共六种)
- 二叉树后续遍历(递归+非递归)
- 二叉树前序遍历和中序遍历 非递归算法
- 递归和非递归俩种方法实现二叉树的前序、中序、后续遍历
- 二叉树的三种遍历递归法和非递归法(前序、中序、后续)
- 二叉树非递归遍历(前序,中序,后续遍序)
- 二叉树的前序、中序、后续遍历,递归、非递归实现
- 【Java语言学习】之递归、非递归前序、中序、后续遍历二叉树
- 二叉树先序、中序、后续遍历递归以及非递归java实现
- 二叉树的各种遍历(先序、中序、后续、层次)——递归、非递归
- leetcode | 二叉树的前序遍历、中序遍历、后续遍历的非递归实现
- 2014 ACM/ICPC 上海区域赛小记
- jsp内置对象值application对象
- util包下的map和collection接口下的link和set实现类
- sgu120
- N皇后问题
- 二叉树前序,中序,后续遍历(递归和非递归)
- oracle 11.2.0.4 rac 恢复到单实例
- libstdc++5的安装
- 5.判断一个链表是否存在环
- 赫夫曼编码
- Brownie Points II - POJ 2464 线段树
- 自定义Android标题栏TitleBar布局
- javascript开发人员的10个关键习惯
- HashMap实现原理分析