二叉树的递归、层次与非递归遍历
来源:互联网 发布:vmware player mac 编辑:程序博客网 时间:2024/05/22 15:49
#include<stdlib.h>
#define STACKINITSIZE 100 //栈大小#define STACKINCREASESIZE 20 //栈单次扩容量 //节点声明,数据域、左孩子指针、右孩子指针typedef struct node{ char data; struct node *lchild,*rchild;}BiTNode,*BiTree; //用于非递归遍历的栈存储的声明,栈底指针、栈顶指针、栈大小typedef struct stack { BiTree * base,* top; int stacksize; }Sqstack; /*****************栈的操作定义********************/ //初始化栈 void InitStack( Sqstack &s ) { s.base = (BiTree *)malloc(STACKINITSIZE*sizeof(BiTree)); if ( !s.base ) { printf("InitStack内存分配出错\n");exit(0); } s.top = s.base; s.stacksize = STACKINITSIZE; } //元素入栈 void Push( Sqstack &s, BiTree e ) { if ( s.top - s.base >= s.stacksize ) { s.base = (BiTree *)realloc(s.base,(s.stacksize+STACKINCREASESIZE)*sizeof(BiTree)); //动态内存分配,栈大小不足时,自动申请扩大空间。 if ( !s.base ) { printf("Push内存分配出错\n"); exit(0); } s.top = s.base + s.stacksize; s.stacksize += STACKINCREASESIZE; } *s.top++ = e; //元素入栈 } //获得栈顶元素 void GetTop( Sqstack s, BiTree &e ) { e = *(s.top - 1); } //弹出栈顶元素 void Pop( Sqstack &s, BiTree &e ) { if ( s.top == s.base ) { printf("栈为空\n"); return ; } e = *(--s.top); } //判断栈是否为空,为空返回1,否则返回0 int StackEmpty( Sqstack s ) { if ( s.top == s.base ) return 1; return 0; } /*****************栈的操作定义********************/ /*建立二叉树(先序)*/BiTree CreateBiTree(){ char ch; BiTree T; ch=getchar(); if(ch=='.')T=NULL; else{ T = (BiTree)malloc(sizeof(BiTNode)); T->data = ch; T->lchild = CreateBiTree(); T->rchild = CreateBiTree(); } return T;//返回根节点} /*先序遍历二叉树*/void PreOrder(BiTree root){ if(root){ printf("%c ",root->data); PreOrder(root->lchild); PreOrder(root->rchild); }} /*中序遍历二叉树*/void InOrder(BiTree root){ if(root){ InOrder(root->lchild); printf("%c ",root->data); InOrder(root->rchild); }} /*后序遍历二叉树*/void PostOrder(BiTree root){ if(root){ PostOrder(root->lchild); PostOrder(root->rchild); printf("%c ",root->data); }} /*按层次遍历二叉树*/void LevelOrder(BiTree root){ int front,rear; BiTree p; BiTree *Queen;Queen=(BiTree *)malloc(sizeof(BiTree *)*1000); front=rear=0; Queen[++rear]=root; while(front != rear) { p=Queen[++front]; printf("%c ",p->data); if(p->lchild) Queen[++rear]=p->lchild; if(p->rchild) Queen[++rear]=p->rchild; }free(Queen); //释放队列空间} /*非递归中序遍历二叉树*/void InOrder1(BiTree root) { BiTree p = root; Sqstack s; InitStack(s); while ( p || !StackEmpty(s) ) { if ( p ) { Push(s,p); p = p->lchild; } else { Pop(s,p); printf("%c ",p->data); p = p->rchild; } } } /*非递归后序遍历二叉树*/void PostOrder1(BiTree root){BiTree p=root,q=NULL;Sqstack s; InitStack(s); while(p!=NULL|| (!StackEmpty(s)) ){while(p!=NULL){Push(s,p); p = p->lchild; }if(!StackEmpty(s)){ GetTop(s,p);if((p->rchild==NULL)||(p->rchild==q)){printf("%c ",p->data);Pop(s,p);q=p;p=NULL;} elsep=p->rchild; }}} /*逆时针旋转90度打印二叉树*/void PrintTree(BiTree bt,int nLayer){int i;if(bt==NULL) return;PrintTree(bt->rchild,nLayer+1);for(i=0;i<nLayer;i++)printf(" ");printf("%c\n",bt->data); PrintTree(bt->lchild,nLayer+1); } int main(void){ BiTree root; printf("请前序创建二叉树:(若孩子节点为NULL,则以字符“.”代替)\n"); root = CreateBiTree();//建立二叉树 printf("\n您输入的二叉树为:(逆时针旋转90度)\n\n");PrintTree(root,0); printf("\n递归前序遍历: ");PreOrder(root); printf("\n递归中序遍历: ");InOrder(root); printf("\n递归后序遍历: "); PostOrder(root); printf("\n\n按照层次遍历: "); LevelOrder(root); printf("\n\n非递归中序遍历: "); InOrder1(root); printf("\n非递归后序遍历: "); PostOrder1(root); printf("\n\n");return 0;}
0 0
- 二叉树的递归、层次与非递归遍历
- 二叉树的非递归层次遍历
- 二叉树的遍历(递归+非递归+层次遍历)
- 二叉树遍历(层次,递归,非递归)
- 二叉树递归与非递归层次遍历
- 二叉树的递归,层次,以及非递归遍历
- 二叉树的各种遍历(递归,非递归,层次)
- 二叉树的遍历(递归,非递归,层次)
- 二叉树的遍历(递归,非递归,层次)
- 二叉树的建立及层次遍历及前中后序遍历递归与非递归的实现
- 二叉树的前序中序后序遍历,非递归遍历 层次遍历
- 二叉树的先序,中序,层次遍历,递归与非递归实现
- 二叉树的非递归遍历及层次遍历
- 二叉树的非递归遍历以及层次遍历
- 二叉树的非递归遍历,层次遍历
- 二叉树(一) 先序遍历、中序遍历、后续遍历、层次遍历的递归与非递归实现
- 非递归按层次遍历二叉树
- 非递归二叉树层次遍历算法
- 开发工程师必看!不管你技术多牛逼
- numpy中一些函数的用法
- XCode6如何创建Category
- hdu 5092 dp
- cp: cannot create symbolic link to fat format of usb: Operation not permitted
- 二叉树的递归、层次与非递归遍历
- 137 朴英 松堂
- 关于cocos2dx空包的大小测试
- Javascript定义类(class)的三种方法
- 新手学js之——简单的带暂停计时器
- 我的java学习之路(1)jdk的安装与配置
- for循环中有多个限制结束条件的正确写法
- 学习Python:__call__的使用
- 第一章 什么是正则表达式