二叉树的遍历
来源:互联网 发布:c 字符串数组拷贝 编辑:程序博客网 时间:2024/05/21 10:36
设计和调试的算法希望对你们有用哟:
1、递归建立二叉树;
2、先序递归遍历二叉树;
3、中序递归遍历二叉树;
4、后序递归遍历二叉树。
5、中序非递归遍历二叉树
首先要建立一个工程,编译器用codeblocks, vc 6.0等,都能运行,但是可能需要自己调试一下,毕竟每个编译器的环境都是不一样的。
头文件//header,h
#include <cstdlib>#include <cstdio>#include <iostream>#include <windows.h>#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW-2#define LIST_INIT_SIZE 100#define LISTINCREMENT 10#define STACK_INIT_SIZE 100#define STACKINCREMENT 10using namespace std; //Status是函数的类型,其值是函数结果状态代码typedef int status;typedef int TelemType;
算法头文件//Bitree.h
#include"header.h"typedef struct BiTNode { TelemTypedata; structBiTNode *lchild,*rchild;} BiTNode,*BiTree;typedef BiTree SElemType;typedef struct { SElemType *base; SElemType *top; int stacksize; }SqStack;status InitStack(SqStack &S) { S.base =(SElemType *)malloc (STACK_INIT_SIZE*sizeof (SElemType)); if(!S.base) exit (OVERFLOW); S.top =S.base; S.stacksize= STACK_INIT_SIZE; return OK; }//InitStackstatus StackEmpty(SqStack S){ if (S.base==S.top) return TRUE; return FALSE;}status Push(SqStack &S, SElemType &e) { if (S.top-S.base>=S.stacksize) //栈满 { S.base=(SElemType *)realloc (S.base, (S.stacksize+STACKINCREMENT) * sizeof(SElemType)); if (!S.base) exit (OVERFLOW); S.top = S.base + S.stacksize; S.stacksize+=STACKINCREMENT; } // if *S.top++ = e; return OK; } //Pushstatus Pop(SqStack &S, SElemType &e) { if(S.top == S.base)return ERROR; e = * -- S.top; return OK; } //Popstatus CreateBiTree(BiTree &T){//按先序次序输入二叉树中结点的值,空格表示空树//生成二叉树的二叉链表存储结构,T为根结点指针] char ch; cin>>ch; if (ch==' ')T=NULL; else{ if(!(T=(BiTNode *) malloc(sizeof(BiTNode)))) exit(OVERFLOW); T->data=ch; //建立根结点 CreateBiTree( T->lchild); //建立左子树 CreateBiTree(T->rchild); //建立右子树 } return OK;} //CreateBiTreestatus PrintElement(TelemType e){ cout<<e; //输出元素值 return OK;}status PreorderTraverse(BiTree T, status(*visit)(TelemType e)) {//先序遍历根结点指针为T的二叉树 if (T) { if(visit(T->data)) if(PreorderTraverse(T->lchild,visit)) if(PreorderTraverse(T->rchild,visit)) return OK; returnERROR; }elsereturn OK; //if (T) }//PreorderTraversestatus InorderTraverse1(BiTree T, status(*visit)(TelemType e)) { //先序遍历根结点指针为T的二叉树 if(T) { if(InorderTraverse1(T->lchild,visit)) if(visit(T->data)) if(InorderTraverse1(T->rchild,visit)) return OK; returnERROR; }elsereturn OK; //if (T)}//InorderTraversestatus PostorderTraverse(BiTreeT, status(*visit)(TelemType e)) {//后序遍历根结点指针为T的二叉树 if (T) { if(PostorderTraverse(T->lchild,visit)) if(PostorderTraverse(T->rchild,visit)) if(visit(T->data)) return OK; returnERROR; }elsereturn OK; //if (T) }//PostorderTraversestatus InorderTraverse2(BiTree T,status(*visit)(TelemType e)) { SqStack S; InitStack(S); BiTree 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; }//else }// while return OK;}// InOrderTraverse
主函数//main.cpp
#include"header.h"#include"Bi tree.h"int main(){ BiTree T; cout<< "Please input characters to create a tree" << endl; CreateBiTree(T); cout<<endl<< "preorder traverse the tree:"<<endl; PreorderTraverse(T, PrintElement); cout<<endl<<"inorder traverse thw tree:digui"<<endl; InorderTraverse1(T,PrintElement); cout<<endl<<"Inorder traverse the tree:feidigui"<<endl; InorderTraverse2(T,PrintElement); cout<<endl<<"Postorder traverse the tree:"<<endl; PostorderTraverse(T,PrintElement); return 0;}
0 0
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- Java并发编程规则:无状态对象永远是线程安全的
- 股票经济人通信网络 poj 1125 多源最短路
- 循环显示页面
- Spring MVC+Maven 实现同一项目的前端和后台交互
- 常用js
- 二叉树的遍历
- poj-3299 Humidex
- 页面跳转3种方法结合倒计时总结
- Android:Material Design之CollapsingToolbarLayout使用
- 优秀的计算机编程类博客 和 文章
- 用Masonry或者Snapkit或者sd_layout布局,得不到控件的尺寸
- git-ssh 配置和使用
- 智和网管平台SugarNMS国防军工行业综合网管解决方案
- js取object的key与value