普通二叉树及其遍历
来源:互联网 发布:石大在线网络教育 编辑:程序博客网 时间:2024/05/01 16:19
一般二叉树,包括前序遍历、中序遍历、后序遍历及它们的非递归算法,层序遍历,树的深度,树的宽度
#include <iostream>#include <stack>#include <queue>using namespace std;typedef struct BiTNode //二叉树结点{ char data; //数据 struct BiTNode *lchild,*rchild; //左右孩子指针} BiTNode,*BiTree;int CreateBiTree(BiTree &T)//按先序序列创建二叉树{ char data; scanf("%c",&data);//按先序次序输入二叉树中结点的值(一个字符),‘#’表示空树 if (data == '#') { T = NULL; } else { T = (BiTree)malloc(sizeof(BiTNode)); T->data = data; //生成根结点 CreateBiTree(T->lchild);//构造左子树 CreateBiTree(T->rchild);//构造右子树 } return 0;}void Visit(BiTree T)//输出{ if (T->data != '#') { printf("%c ",T->data); }}void PreOrder(BiTree T)//先序遍历{ if (T != NULL) { Visit(T); //访问根节点 PreOrder(T->lchild); //访问左子结点 PreOrder(T->rchild); //访问右子结点 }}void InOrder(BiTree T)//中序遍历{ if (T != NULL) { InOrder(T->lchild); //访问左子结点 Visit(T); //访问根节点 InOrder(T->rchild); //访问右子结点 }}void PostOrder(BiTree T)//后序遍历{ if (T != NULL) { PostOrder(T->lchild); //访问左子结点 PostOrder(T->rchild); //访问右子结点 Visit(T); //访问根节点 }}void PreOrder2(BiTree T)//先序遍历(非递归){//访问T->data后,将T入栈,遍历左子树;遍历完左子树返回时,栈顶元素应为T,出栈,再先序遍历T的右子树。 stack<BiTree> stack; BiTree p = T;//p是遍历指针 while (p || !stack.empty()) { //栈不空或者p不空时循环 if (p != NULL) { stack.push(p); //存入栈中 printf("%c ",p->data); //访问根节点 p = p->lchild; //遍历左子树 } else { p = stack.top(); //退栈 stack.pop(); p = p->rchild; //访问右子树 } }}void InOrder2(BiTree T)//中序遍历(非递归){//T是要遍历树的根指针,中序遍历要求在遍历完左子树后,访问根,再遍历右子树。//先将T入栈,遍历左子树;遍历完左子树返回时,栈顶元素应为T,出栈,访问T->data,再中序遍历T的右子树。 stack<BiTree> stack; BiTree p = T;//p是遍历指针 while (p || !stack.empty()) { //栈不空或者p不空时循环 if (p != NULL) { stack.push(p); //存入栈中 p = p->lchild; //遍历左子树 } else { p = stack.top(); //退栈,访问根节点 printf("%c ",p->data); stack.pop(); p = p->rchild; //访问右子树 } }}typedef struct BiTNodePost{ BiTree biTree; char tag;} BiTNodePost,*BiTreePost;void PostOrder2(BiTree T)//后序遍历(非递归){ stack<BiTreePost> stack; BiTree p = T;//p是遍历指针 BiTreePost BT; while (p != NULL || !stack.empty())//栈不空或者p不空时循环{ while (p != NULL)//遍历左子树{ BT = (BiTreePost)malloc(sizeof(BiTNodePost)); BT->biTree = p; BT->tag = 'L';//访问过左子树 stack.push(BT); p = p->lchild; } while (!stack.empty() && (stack.top())->tag == 'R')//左右子树访问完毕访问根节点{ BT = stack.top(); stack.pop();//退栈 printf("%c ",BT->biTree->data); } if (!stack.empty())//遍历右子树{ BT = stack.top(); BT->tag = 'R';//访问过右子树 p = BT->biTree; p = p->rchild; } }}void LevelOrder(BiTree T)//层次遍历{ if (T == NULL) return; BiTree p = T; queue<BiTree> queue;//队列 queue.push(p);//根节点入队 while (!queue.empty()) { //队列不空循环 p = queue.front(); //对头元素出队 printf("%c ",p->data); //访问p指向的结点 queue.pop(); //退出队列 if (p->lchild != NULL)//左子树不空,将左子树入队{ queue.push(p->lchild); } if (p->rchild != NULL)//右子树不空,将右子树入队{ queue.push(p->rchild); } }}//求树的深度int GetDepth(BiTree T){if(T==NULL)return 0;return GetDepth(T->lchild)>GetDepth(T->rchild)?GetDepth(T->lchild)+1:GetDepth(T->rchild)+1;}//求树的宽度int GetWidth(BiTree T){if(T==NULL)return 0;int LastLevelWidth=1;int CurLevelWidth=1;int tmpwidth;//遍历下一级树节点时使用int width=1; //树的最大宽度queue<BiTree>myQueue;BiTree tmp;myQueue.push(T);while(!myQueue.empty()){tmpwidth=LastLevelWidth;while(tmpwidth>0){tmp=myQueue.front();myQueue.pop();if(tmp->lchild!=NULL)myQueue.push(tmp->lchild);if(tmp->rchild!=NULL)myQueue.push(tmp->rchild);tmpwidth--;}CurLevelWidth=myQueue.size();width=CurLevelWidth>width?CurLevelWidth:width;LastLevelWidth=CurLevelWidth;}return width;}int main() { BiTree T; CreateBiTree(T); printf("先序遍历 :");PreOrder (T);printf("\n"); printf("先序遍历(非递归):");PreOrder2 (T);printf("\n"); printf("\n"); printf("中序遍历 :");InOrder (T);printf("\n"); printf("中序遍历(非递归):");InOrder2 (T);printf("\n"); printf("\n"); printf("后序遍历 :");PostOrder (T);printf("\n"); printf("后序遍历(非递归):");PostOrder2(T);printf("\n"); printf("\n"); printf("层次遍历 :");LevelOrder(T);printf("\n");printf("树的深度为:%d\n",GetDepth(T));printf("树的宽度为:%d\n",GetWidth(T)); return 0;}//ABC##DE#G##F###//先序遍历 :A B C D E G F//先序遍历(非递归):A B C D E G F////中序遍历 :C B E G D F A//中序遍历(非递归):C B E G D F A////后序遍历 :C G E F D B A//后序遍历(非递归):C G E F D B A////层次遍历 :A B C D E F G////树的深度为:5//树的宽度为:2/// A/// //// B/// / \/// C D/// / \/// E F/// \/// G
来源:http://bbs.csdn.net/topics/390817857
0 0
- 普通二叉树及其遍历
- 普通二叉树及其树形
- 二叉树及其遍历
- 二叉树及其遍历
- 二叉树及其遍历
- 二叉树及其遍历
- 排序二叉树及其遍历
- 遍历二叉树及其应用
- 二叉树创建及其遍历
- 二叉树及其遍历算法
- 二叉树及其各种遍历
- 线索二叉树及其遍历
- 遍历二叉树及其应用
- 二叉树 普通的 建立和遍历
- 二叉树及其应用--二叉树遍历
- 二叉树及其遍历方式(java)
- 二叉树建立及其遍历模板
- 二叉树的存储结构及其遍历
- 大牛博客网站链接
- svn is already a working copy for a different URL
- uva 108(最大连续矩阵和)
- POJ1664:放苹果(整数划分)
- Windows脚本语法
- 普通二叉树及其遍历
- Eclipse tomcat部署访问程序一直和开发程序不符合
- 我在兰亭这三年完结篇之离开
- MaxEnt: 最大熵模型(Maximum Entropy Models)(二)
- 如何防止域名被盗
- JAVA BigDecimal初步学习
- 冒泡排序法(Java)
- 常用宏定义 #define
- UVA - 10305 Ordering Tasks