二叉树 先序,中序,后序遍历(递归与非递归)C语言
2018-12-02 21:46
225 查看
二叉树 先序,中序,后序遍历(递归与非递归)C语言
#include<stdio.h> #include<stdlib.h> #define error 0 #define ok 1 #define overflow -1 #define STACK_INIT_SIZE 100 // 存储空间初始分配量。 #define STACKINCREMENT 10 // 存储空间分配增量。 typedef int status; typedef struct bitnode { char data; bitnode *lchild; bitnode *rchild; }bitnode,*bitree; typedef struct { bitree *base;//在栈构造之前和销毁之后,base的值为 NULL。 bitree *top;//栈顶指针。 int stacksize;// 当前已分配的存储空间,以元素为单位。 }sqstack; status initstack(sqstack &s)//构造空栈s。 { s.base=(bitree *)malloc(STACK_INIT_SIZE*sizeof(bitree)); if(s.base==NULL)exit(overflow);//存储分配失败。 s.top=s.base; s.stacksize=STACK_INIT_SIZE; return ok; }//initstack. status push(sqstack &s,bitree e)//插入元素e为新的栈顶元素。 { if(s.top-s.base>=s.stacksize)//判满。 { s.base=(bitree *)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(bitree)); if(s.base==NULL)exit(overflow); s.top=s.base+s.stacksize; s.stacksize+=STACKINCREMENT; } *s.top++=e; //*s.top=e;s.top++; return ok; }//push status stackempty(sqstack &s)//判空。 { if(s.base==s.top)return ok; return error; }//stackempty。 status pop(sqstack &s,bitree &x)//返回栈顶元素,并删除。 { if(s.top==s.base)return error; x=*--s.top; return ok; }//pop. status gettop(sqstack s,bitree &e)//取栈顶元素,不删除。 { if(s.base==s.top)return error; e=*(--s.top); return ok; }//gettop. int stacklength(sqstack &s)//返回长度。 { return s.top-s.base; }//length. status createbitree(bitree &t)//先序次序输入二叉树中节点值(char),空格字符表示空树。 { char ch; scanf("%c",&ch); if(ch==' ')t=NULL; else { t=(bitnode *)malloc(sizeof(bitnode)); if(t==NULL)exit(overflow); t->data=ch; createbitree(t->lchild); createbitree(t->rchild); } return ok; }//createbitree. status printelement(char e) { printf("%c\n",e); return ok; } status preordertraverse0(bitree t,status (*visit)(char e))//先序遍历。 DLR 递归。 { if(t) { visit(t->data); preordertraverse0(t->lchild,visit); preordertraverse0(t->rchild,visit); return ok; } else return ok; }// preordertraverse. status preordertraverse1(bitree t,status(*visit)(char e))//先序遍历 DLR 非递归。 { sqstack s; initstack(s); bitree p=t; while(p||!stackempty(s)) { if(p) { push(s,p); visit(p->data); p=p->lchild; } else { pop(s,p); p=p->rchild; } } return ok; } status inordertraverse0(bitree t,status(*visit)(char e))//LDR 中序遍历 LDR 非递归。 { sqstack s; bitree p=NULL; 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); } } } status inordertraverse1(bitree t,status(*visit)(char e))//中序遍历 LDR 非递归。 { sqstack s; initstack(s); bitree p=NULL; 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; } } return ok; } status inordertraverse2(bitree t,status(*visit)(char e))//中序遍历 LDR 递归。 { if(t) { inordertraverse2(t->lchild,visit); visit(t->data); inordertraverse2(t->rchild,visit); } return ok; } status postordertraverse1(bitree t,status(*visit)(char e))//后序遍历 非递归 LRD。 { sqstack s; initstack(s); bitree p=t,f=NULL; while(p||!stackempty(s)) { if(p) { push(s,p); p=p->lchild; } else { gettop(s,p); if(p->rchild&&p->rchild!=f) { p=p->rchild; push(s,p); p=p->lchild; } else { pop(s,p); visit(p->data); f=p; p=NULL; } } } return ok; } status postordertraverse0(bitree t,status(*visit)(char e))//后序遍历 LRD 递归。 { if(t) { postordertraverse0(t->lchild,visit); postordertraverse0(t->rchild,visit); visit(t->data); } return ok; }
相关文章推荐
- c语言实现二叉树先序,中序,后序(递归),层次遍历,求叶子节点个数及树的深度,下一篇写非递归的遍历
- Java数据结构:二叉树的前序,中序,后序遍历(递归和非递归)
- 二叉树的建树、遍历(先序、中序、后序、层次)(递归和非递归)--Java实现
- 二叉树详解及二叉树的前序、中序、后序遍历(递归和非递归)
- C语言递归实现二叉树的先序、中序、后序遍历
- 二叉树前序、中序、后序非递归遍历实现(C语言)
- java语言实现二叉树的前序、中序与后序遍历(递归与非递归)
- 二叉树的前序、中序、后序遍历(递归与非递归)
- 用非递归实现二叉树的前序、中序、后序、层次遍历,用递归实现查找、统计个数、比较、求深度
- 数据结构---二叉树的前序、中序、后序遍历的递归和非递归 实现(C++)
- 二叉树的先序,中序,后序,层次的递归及非递归遍历
- C语言二叉树常见操作详解【前序,中序,后序,层次遍历及非递归查找,统计个数,比较,求深度】
- 二叉树的深度优先dfs遍历(前序、中序和后序;递归与非递归)
- 数据结构_二叉树的先序建立与先序,中序,后序(递归)遍历方式_C语言源代码
- c++实现二叉树的非递归创建以及非递归先序、中序、后序遍历
- 二叉树2:层次遍历方式及先序、中序、后序(递归与非递归)遍历方式
- C语言非递归实现二叉树的先序、中序、后序、层序遍历
- java语言实现二叉树的前序、中序与后序遍历(递归与非递归) 层次遍历
- 数据结构:二叉树的前序,中序,后序遍历(递归和非递归)
- 二叉树的先序中序后序遍历 (递归和非递归)