二叉树的相关操作代码(继续补全中)
2015-03-27 15:17
429 查看
#ifndef BITREEOPERATION_H #define BITREEOPERATION_H #include<stdio.h> #include<stdlib.h> #include<stack> #include<queue> typedef char ElemType; typedef struct BiNode{ ElemType data; struct BiNode *lchild,*rchild; }BiNode,*BiTree; //先序建立二叉树 int PreOrderCreateBiTree(BiTree& Root){ char ch; scanf("%c",&ch); if(ch==' ') Root=NULL; else{ Root=(BiTree)malloc(sizeof(BiNode)); Root->data=ch;//生成根节点 PreOrderCreateBiTree(Root->lchild);//构造左子树 PreOrderCreateBiTree(Root->rchild);//构造右子树 } return 0; } //先序的递归遍历 void PreOrderTraverse(BiTree Root){ if(Root!=NULL){ printf("%c",Root->data);//访问根节点 PreOrderTraverse(Root->lchild);//先序遍历左子树 PreOrderTraverse(Root->rchild);//先序遍历右子树 } } //中序的递归遍历 void InOrderTraverse(BiTree Root){ if(Root!=NULL){ PreOrderTraverse(Root->lchild);//中序遍历左子树 printf("%c",Root->data);//访问根节点 PreOrderTraverse(Root->rchild);//中序遍历右子树 } } //后序的递归遍历 void PostOrderTraverse(BiTree Root){ if(Root!=NULL){ PreOrderTraverse(Root->lchild);//后序遍历左子树 PreOrderTraverse(Root->rchild);//后序遍历右子树 printf("%c",Root->data);//访问根节点 } } //先序的非递归遍历,使用到栈结构 void PreOrderNonRecur(BiTree Root){ std::stack<BiTree> cstack; BiTree p=Root; while(p||!cstack.empty()){ if(p){//根指针进栈,访问根节点,遍历左子树 cstack.push(p); printf("%c",p->data); p=p->lchild; }else{//根指针退栈,遍历右子树 p=cstack.top(); cstack.pop(); p=p->rchild; } } } //中序的非递归遍历 void InOrderNonRecur(BiTree Root){ if(Root!=NULL){ std::stack<BiTree> cstack; BiTree p=Root; while(p||!cstack.empty()){ if(p){//根指针进栈,遍历左子树 cstack.push(p); p=p->lchild; }else{//根指针退栈,访问根节点,遍历右子树 p=cstack.top(); cstack.pop(); printf("%c",p->data); p=p->rchild; } } } } //后序的非递归遍历比较麻烦些,暂时不讨论 //层序遍历,使用到队列结构 void levelOrderTraverse(BiTree Root){ if(Root!=NULL){ std::queue<BiTree> cqueue; BiTree p=Root; cqueue.push(p); while(!cqueue.empty()){ p=cqueue.front(); cqueue.pop();//根节点出队列 printf("%c",p->data); if(p->lchild!=NULL) cqueue.push(p->lchild); if(p->rchild!=NULL) cqueue.push(p->rchild); } } } //递归求树的高度 int getBiTreeHeight(BiTree Root){ if(Root==NULL) return 0; //空树返回0 else{ int lheight=getBiTreeHeight(Root->lchild);//递归求左子树高度 int rheight=getBiTreeHeight(Root->rchild);//递归求右子树高度 return lheight>rheight? lheight+1:rheight+1;//树的高度为左右子树的最大者 } } //求特定节点的父节点 BiTree PreOrderTraverse(BiTree Root,char target,BiTree parent){ if(Root!=NULL){ if(Root->data==target) return parent; BiTree lparent=PreOrderTraverse(Root->lchild,target,Root);//先序遍历左子树 if(lparent) return lparent; BiTree rparent=PreOrderTraverse(Root->rchild,target,Root);//先序遍历右子树 if(rparent) return rparent; } return NULL;//若返回Null,则代表该子树不存在目标字符 } #endif
相关文章推荐
- Python 实现二叉树相关操作
- CompressUtils相关代码,java中文件压缩或解压已经文件的基本操作等方法
- C++实现二叉树相关操作
- B树相关操作纯代码(除删除操作)
- 二叉树的相关操作
- JS时间相关操作代码
- 二叉树的相关操作
- 二叉树 相关操作
- 【23】二叉树的相关操作
- 二叉树转换为双向链表,以及二叉树相关操作---纪念考研的时光
- 二叉树的建立及相关操作
- Aspose相关操作代码
- 题 阅读 评论 评论权限 操作 以前实习期间写的一段mfc编程,对数据库和xml格式文档的相关操作 主要相关代码 之五 导入xml格式文档数据到数据库
- (二叉树)谈一谈各类算法和数据结构的c++实现以及相关操作的复杂度(二)
- 二叉树相关处理操作
- java 发送邮件 email相关操作代码测试,生成复杂格式邮件,发送邮件相关操作
- CI框架中redis缓存相关操作文件示例代码
- 二叉树的相关操作:创建、查找、求高度和深度、各种遍历(前、中、后、层序)等等
- 数据结构与算法====》二叉树相关操作
- 操作MySQL数据库相关代码