二叉树的遍历源代码(C语言)

合集下载

C++数据结构已知二叉树的前序遍历与中序遍历结果求后序遍历

C++数据结构已知二叉树的前序遍历与中序遍历结果求后序遍历

C++数据结构已知二叉树的前序遍历与中序遍历结果求后序遍历二叉树的遍历问题描述输入一棵二叉树的先序和中序遍历序列,输出其后序遍历序列。

输入输入文件为tree.in,共两行,第一行一个字符串,表示树的先序遍历,第二行一个字符串,表示树的中序遍历。

树的结点一律用小写字母表示。

输出输出文件为tree.out,仅一行,表示树的后序遍历序列。

样例输入abdecdbeac样例输出debca--------------------------------------------------------------------- --------------------------------------------------------------------- #includeusing namespace std;struct tree{char data;tree *l,*r;};tree * create(char pre[],char in[]){tree *root;if(strlen(pre)==0) {root=NULL;}else{root=new tree;root->data=pre[0];char pre1[20];pre1[0]='\0';char pre2[20];pre2[0]='\0';char in1[20];in1[0]='\0';char in2[20];in2[0]='\0';int n=1;for(int i=0;i<strlen(in);i++){< p=""> if(in[i]!=pre[0]&&n==1){in1[i]=in[i];in1[i+1]='\0';}if(in[i]==pre[0]) n=2;if(in[i]!=pre[0]&&n==2){in2[i-strlen(in1)-1]=in[i];in2[i-strlen(in1)+1]='\0';}}for(int i=1;i<strlen(pre);i++){< p=""> if(i<strlen(in1)+1){< p="">pre1[i-1]=pre[i];pre1[i]='\0';}else {pre2[i-1-strlen(pre1)]=pre[i];pre2[i-strlen(pre1)]='\0';}}root->l=create(pre1,in1);root->r=create(pre2,in2);}return root;}void post(tree * root){if(root==NULL) return; else {post(root->l);post(root->r);cout<data;}}int main(){char pre[100];char in[100];cin>>pre;cin>>in;tree * root=create(pre,in); post(root);return 0;}</strlen(in1)+1){<></strlen(pre);i++){<></strlen(in);i++){<>。

二叉树的先序,中序,后序遍历c语言

二叉树的先序,中序,后序遍历c语言

二叉树的先序,中序,后序遍历c语言
二叉树是常见的数据结构,具有广泛的应用场景,例如搜索树、哈夫曼树等。

其中比较重要的一点就是对二叉树的遍历。

二叉树遍历有三种方式:先序遍历、中序遍历、后序遍历。

接下来,我将通过C语言来详细介绍这三种遍历方式。

一、先序遍历(Preorder Traversal)
先序遍历是指根节点->左子树->右子树的遍历方式。

C语言中的先序遍历算法如下:
```
void preorderTraversal(Node *node) {
if (node != NULL) {
printf("%d ", node->data); // 打印节点值
preorderTraversal(node->left); // 递归遍历左子树
preorderTraversal(node->right); // 递归遍历右子树
}
}
```
先序遍历的实现通过递归调用实现,当节点为空即遍历完成时返回。

总结:
以上三种遍历方式是二叉树遍历中最基本的方法,它们都是基于递归实现的。

通过学习这三种遍历方式,可以更好地理解二叉树的结构特点,提高数据结构算法的学习效果。

二叉树遍历(前中后序遍历,三种方式)

二叉树遍历(前中后序遍历,三种方式)

⼆叉树遍历(前中后序遍历,三种⽅式)⽬录刷题中碰到⼆叉树的遍历,就查找了⼆叉树遍历的⼏种思路,在此做个总结。

对应的LeetCode题⽬如下:,,,接下来以前序遍历来说明三种解法的思想,后⾯中序和后续直接给出代码。

⾸先定义⼆叉树的数据结构如下://Definition for a binary tree node.struct TreeNode {int val;TreeNode *left;TreeNode *right;TreeNode(int x) : val(x), left(NULL), right(NULL) {}};前序遍历,顺序是“根-左-右”。

使⽤递归实现:递归的思想很简单就是我们每次访问根节点后就递归访问其左节点,左节点访问结束后再递归的访问右节点。

代码如下:class Solution {public:vector<int> preorderTraversal(TreeNode* root) {if(root == NULL) return {};vector<int> res;helper(root,res);return res;}void helper(TreeNode *root, vector<int> &res){res.push_back(root->val);if(root->left) helper(root->left, res);if(root->right) helper(root->right, res);}};使⽤辅助栈迭代实现:算法为:先把根节点push到辅助栈中,然后循环检测栈是否为空,若不空,则取出栈顶元素,保存值到vector中,之后由于需要想访问左⼦节点,所以我们在将根节点的⼦节点⼊栈时要先经右节点⼊栈,再将左节点⼊栈,这样出栈时就会先判断左⼦节点。

代码如下:class Solution {public:vector<int> preorderTraversal(TreeNode* root) {if(root == NULL) return {};vector<int> res;stack<TreeNode*> st;st.push(root);while(!st.empty()){//将根节点出栈放⼊结果集中TreeNode *t = st.top();st.pop();res.push_back(t->val);//先⼊栈右节点,后左节点if(t->right) st.push(t->right);if(t->left) st.push(t->left);}return res;}};Morris Traversal⽅法具体的详细解释可以参考如下链接:这种解法可以实现O(N)的时间复杂度和O(1)的空间复杂度。

二叉树二叉链表的层序遍历(C语言)

二叉树二叉链表的层序遍历(C语言)

⼆叉树⼆叉链表的层序遍历(C语⾔)所谓⼆叉树层序遍历,即从⼆叉树根结点开始,按从上到下、从左到右的顺序访问每⼀个结点。

每个结点只访问⼀次。

#include <stdio.h>#include <stdlib.h>/*** ⼆叉树⼆叉链表之⾮递归遍历:层序遍历* 算法思想:借助⼀个队列;根树进队;队不为空时循环“从队列中出⼀个树p,访问该树根结点;* 若它有左⼦树,左⼦树进队;若它有右⼦树,右⼦树进队。

”* (保证了元素进队顺序是从树的上层到下层,且同层元素在队列中从左到右相邻)* (注:为了节约空间,这⾥的树进队,是指树的地址进队,⽽不是树结点进队,队列中存放的是对各树地址的引⽤)*/#define OK 1;#define TURE 1;#define FALSE 0;#define ERROR 0;const int OVERFLOW = -2;const int MAXSIZE = 100;typedef int Status;typedef char TElemType;//⼆叉链表结构定义typedef struct BiNode{TElemType data;struct BiNode *lchild, *rchild;} BiNode, *BiTree;//顺序循环队列定义typedef struct {BiTree *base; //存放树型指针int front; //头指针,若队列不为空,指向队列头元素int rear; //尾指针,若队列不为空,指向队列尾元素的下⼀个位置} SqQueue;//由字符序列创建⼆叉树Status CreateBiTree(BiTree *tree,TElemType data[],int *j,int len){if((*j)<=len-1){if(data[(*j)]=='#'){(*tree)=NULL;(*j)++;} else {(*tree)=(BiTree)malloc(sizeof(BiNode));if(!(*tree)) return OVERFLOW;(*tree)->data=data[(*j)]; //⽣成根结点(*j)++;CreateBiTree(&((*tree)->lchild),data,j,len); //构造左⼦树CreateBiTree(&((*tree)->rchild),data,j,len); //构造右⼦树}}return OK;}//访问⼆叉树结点Status Visit(BiTree tree){printf("%c",tree->data);return OK;}//借助队列实现⼆叉链表的层序遍历Status LevelOrder_ByQueue(BiTree tree) {BiTree p;SqQueue queue1;InitQueue(&queue1);EnQueue(&queue1,tree); //根结点⼊队while(queue1.front!=queue1.rear){ //队不为空DeQueue(&queue1,&p); //根节点出队Visit(p);if(p->lchild!=NULL) EnQueue(&queue1,p->lchild); //有左孩⼦就进队if(p->rchild!=NULL) EnQueue(&queue1,p->rchild); //有右孩⼦也进队}return OK;}/***⽤到队列的相关函数***///循环队列初始化Status InitQueue(SqQueue *queue) {queue->base=(BiTree*)malloc(sizeof(BiTree)*MAXSIZE); //分配队列数组空间if(!queue->base) return OVERFLOW; //分配失败queue->front=0;queue->rear=0;return OK;}//循环队列⼊队操作Status EnQueue(SqQueue *queue,BiTree elem){if((queue->rear+1)%MAXSIZE==queue->front){ //队满return ERROR;} else {queue->base[queue->rear]=elem;queue->rear=(queue->rear+1)%MAXSIZE;return OK;}}//循环队列出队操作Status DeQueue(SqQueue *queue,BiTree *elem){if(queue->front==queue->rear){ //队空return ERROR;} else {(*elem)=queue->base[queue->front];queue->front=(queue->front+1)%MAXSIZE;return OK;}}int main(void){//⽰例⼆叉树的结构/*A/B/ \C D/ \E F\G*///指向⼆叉树的指针BiTree bitree1;//创建⼆叉树待⽤数据TElemType data1[]={'A','B','C','#','#','D','E','#','G','#','#','F','#','#','#',}; //先序遍历序列int len1=sizeof(data1)/sizeof(data1[0]);int* j1=(int*)malloc(sizeof(int));*j1=0;//按先序遍历序列创建⼆叉树Status createBiTreeResult = CreateBiTree(&bitree1,data1,j1,len1);printf("⼆叉树创建结果:%d\n",createBiTreeResult);//层序遍历⼆叉树Status levelOrder_ByQueue = LevelOrder_ByQueue(bitree1); //注:这⾥参数是⼆叉树根结点,⽽不是指针 printf("\n层序遍历⼆叉树结果:%d\n",levelOrder_ByQueue);printf("\nEND");return0;}。

关于树的各种C语言代码

关于树的各种C语言代码

集合了树的各种算法,已经运行过,本人亲自所写,先序,后序,等全包括#include<stdio.h>#include<malloc.h>#define Max 100typedef int Status;typedef struct BiTNode{char data;struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;int count;Status CreatBiTree(BiTree *bt) /*1.按先序遍历序列创造二叉树的二叉链表*/ {char ch;getchar();scanf("%c",&ch);if (ch == ' '){*bt = NULL;}else{*bt = (BiTree)malloc(sizeof(BiTNode));(*bt)->data = ch;printf("\n\t请输入%c结点的左孩子:",(*bt)->data);CreatBiTree(&((*bt)->lchild));printf("\n\t请输入%c结点的右孩子:",(*bt)->data);CreatBiTree(&((*bt)->rchild));}return 1;}void PreOrder(BiTree bt) /*2.先序遍历二叉树*/{if (bt != NULL){printf("%c\n",bt->data);PreOrder(bt->lchild);PreOrder(bt->rchild);}}void InOrder(BiTree bt) /*3.中序遍历二叉树*/{if (bt != NULL){InOrder(bt->lchild);printf("%c\n",bt->data);InOrder(bt->rchild);}}void PostOrder(BiTree bt) /*4.后序遍历二叉树*/{if (bt != NULL){PostOrder(bt->lchild);PostOrder(bt->rchild);printf("%c\n",bt->data);}}void PreOrderLeaf(BiTree bt) /*5.输出所有的叶子结点*/{if (bt != NULL){if ((bt->lchild == NULL) && (bt->rchild == NULL)){printf("%c\n",bt->data);}PreOrderLeaf(bt->lchild);PreOrderLeaf(bt->rchild);}}Status Leaf(BiTree bt) /*6.统计叶子结点数目,即度为零的结点数目*/ {if (bt == NULL){count = 0;}else if ((bt->lchild == NULL) && (bt->rchild == NULL)){count = 1;}else{count = Leaf(bt->lchild) + Leaf(bt->rchild);}return count;}void Degree1Node(BiTree bt) /*7.输出度为一的结点*/{if (bt != NULL){if (((bt->lchild != NULL) || (bt->rchild != NULL))&& (!((bt->lchild != NULL) && (bt->rchild != NULL)))) {printf("%c\n",bt->data);}Degree1Node(bt->lchild);Degree1Node(bt->rchild);}}void Degree2Node(BiTree bt) /*8.输出度为二的结点*/{if ( bt != NULL){if ((bt->lchild != NULL) && (bt->rchild != NULL)){printf("%c\n",bt->data);}Degree2Node(bt->lchild);Degree2Node(bt->rchild);}}Status CountNode(BiTree bt) /*9.统计二叉树中结点的总数*/{if (bt == NULL){return 0;}else{count++;CountNode(bt->lchild);CountNode(bt->rchild);return count;}}Status TreeDepth(BiTree bt) /*10.求二叉树的深度*/{int ldep, rdep;if (bt == NULL){return 0;}else{ldep = TreeDepth(bt->lchild);rdep = TreeDepth(bt->rchild);if (ldep > rdep){return (ldep +1);}else{return (rdep + 1);}}}void PrintTree(BiTree bt, int nlayer) /*11.按树状打印二叉树*/ {if (bt == NULL) /*如果是空则直接退出函数*/{return;}PrintTree(bt->rchild,nlayer + 1);for ( int i = 0; i < nlayer; i++){printf("----");}printf("%c\n",bt->data);PrintTree(bt->lchild,nlayer + 1);}void PreOrderTree(BiTree bt) /*12.非递归先序遍历*/BiTree Stack[Max];BiTree p = bt;int top = 0;while (p != NULL || top != 0){if (p != NULL){printf("%c",p->data);top++;Stack[top] = p;p = p->lchild;}else{p = Stack[top];top--;p = p->rchild;}}}void InOrderTree(BiTree bt) /*13.非递归中序遍历*/ {BiTree Stack[Max];BiTree p = bt;int top = 0;do{while (p != NULL){top++;Stack[top] = p;p = p->lchild;}if (top != 0){p = Stack[top];top--;printf("%c",p->data);p = p->rchild;}}while ((p != NULL) || (top != 0));void PostOrderTree(BiTree bt) /*14.非递归后序遍历*/ {BiTree p, q;int top = 0;BiTree Stack[Max];q = NULL;p = bt;while ((p != NULL) || (top != 0)){while (p != NULL){top++;Stack[top] = p;p = p->lchild;}if (top > 0){p = Stack[top];if ((p->rchild == NULL) || (p->rchild == q)){printf("%c",p->data);q = p;p = NULL;top--;}else{p = p->rchild;}}}}void LayerOrder(BiTree bt) /*15.层次遍历*/{int front,rear;BiTree Q[Max];front = 0;rear = front;BiTree r, s, p;r = s = p = bt;if (p == NULL) return;Q[rear] = p;rear++;while (front != rear){s = r = Q[front];printf("%c",Q[front]->data);front++;if (r->lchild){Q[rear] = r->lchild;rear++;}if (s->rchild){Q[rear] = s->rchild;rear++;}}}int main(){BiTree bt;int choice;int i,j,k;int nlayer = 1;printf("请用数字选择操作:\n");printf("1.按先序序列创建二叉树(二叉链表)\n");printf("2.递归先序遍历二叉树\n");printf("3.递归中序遍历二叉树\n");printf("4.递归后序遍历二叉树\n");printf("5.输出叶子结点(即度为零的结点)\n");printf("6.统计叶子结点数目\n");printf("7.输出度为一的结点\n");printf("8.输出度为二的结点\n");printf("9.统计二叉树中结点总数\n");printf("10.求二叉树的高度(即深度)\n");printf("11.按树状打印二叉树\n");printf("12.非递归先序遍历二叉树\n");printf("13.非递归中序遍历二叉树\n");printf("14.非递归后序遍历二叉树\n");printf("15.层次遍历二叉树\n");printf("0.则退出\n");while (1){printf("请输入你要执行的操作(0-15):");scanf("%d",&choice);if (choice == 0){break;}else switch (choice){case 1 : printf("\n请输入按先序建立二叉树的结点序列:");printf("\n说明:逐个输入,输入空格代表后继结点为空,按回车输入下一个结点。

数据结构课程设计报告-最短路径算法-二叉树的三种遍历

数据结构课程设计报告-最短路径算法-二叉树的三种遍历

数据结构课程设计报告班级:计算机科学与技术132班姓名:赖恒财指导教师:董跃华成绩:32信息工程学院2015 年7月8日目录图的最短路径算法实现1. 需求分析 (1)1.1 程序设计内容 (1)1.2 设计要求 (1)2.概要设计 (2)3.详细设计 (2)3.1 数据类型的定义 (2)3.2 功能模块的设计 (2)3.3 主程序流程 (9)4.调试分析 (10)4.1 问题回顾和分析 (10)4.2.经验和体会 (11)5.测试结果 (12)二叉树的遍历1.设计目的 (13)2.需求分析 (14)2.1课程设计的内容和要求 (14)2.2选题的意义及背景 (14)3.概要设计 (14)3.1设计思想 (14)3.2程序数据类型 (16)3.3程序模块分析 (16)3.3.1置空栈 (16)3.3.2入栈 (17)3.3.3出栈 (17)3.3.4取栈顶操作 (17)3.3.5判空栈 (17)3.4函数关系: (18)4.详细设计 (18)4.1二叉树算法程序截图和结果 (18)5.程序测试结果及问题分析 (19)6.总结 (20)参考文献 (21)附录1 (22)附录2 (26)图的最短路径算法实现----基于floyd最短路径算法1.需求分析设计校园平面图,所含景点不少于8个。

以图中顶点表示学校内各景点,存放景点的名称、景点介绍信息等;以边表示路径,存放路径长度信息。

要求将这些信息保存在文件graph.txt中,系统执行时所处理的数据要对此文件分别进行读写操作。

1.1程序设计内容1.从文件graph.txt中读取相应数据, 创建一个图,使用邻接矩阵表示图;2.景点信息查询:为来访客人提供校园任意景点相关信息的介绍;3.问路查询:为来访客人提供校园任意两个景点之间的一条最短路径。

1.2 设计要求(1) 程序要具在一定的健壮性,即当输入数据非法时,程序也能适当地做出反应。

(2) 程序要添加适当的注释,程序的书写要采用缩进格式。

数据结构课程设计二叉树遍历C++语言

数据结构课程设计二叉树遍历C++语言

淮阴工学院实践报告数据结构课程设计设计题目:二叉树遍历系别:计算机工程学院专业:软件工程班级:软件1111学生姓名: 周淼学号: 1111315217起止日期: 2012年12月24日~2012年12月30日指导教师:寇海洲摘要:现代社会生活中,计算机扮演着重要角色,而随着计算机运行速度的不断加快,对数据的处理能力也日益增强,因此,程序所涉及的数据成爆发式增长。

随之而来的问题就是如何科学有效的对数据进行操作,使得计算机的时间和空间利用率最高。

针对这样的问题,我选择了二叉树对数据的各种操作作为我的课程设计主题,希望通过课程设计来提高对数据的处理能力,促进对数据结构课程的理解,在日后面向对象的程序设计中科学的规划数据结构。

在本次课程设计中,二叉树的建立使用了递归算法,遍历则同时使用了递归与非递归的算法,同时,在遍历算法的实现中使用了栈结构与队列结构,这大大方便了二叉树的遍历。

在前序、中序、后续遍历算法中,分别实现了递归与非递归算法,从实际应用中体验了递归这一算法的优越性。

关键词:二叉树建立,递归与非递归,遍历,栈,队列编号:47淮阴工学院软件工程专业数据结构课程设计答辩记录课题名称:二叉树的算法班级软件1111 学号1111315217 姓名周淼记录人:寇海洲2012 年12 月28日目录1需求分析 (6)1.1二叉树与树结构 (6)1.2面向对象的程序设计 (6)1.3二叉树遍历的应用 (6)1.4软件运行环境:Visual C++ 6.0版本 (6)2概要设计 (7)2.1 总体功能结构 (7)2.2数据结构部分设计 (7)2.2.1结点结构 (7)2.2.2 二叉树结构 (8)3详细设计 (13)3.1建立二叉树 (13)3.1.1功能描述 (13)3.1.2算法原理 (13)3.1.3 具体程序 (13)3.2 前序遍历 (14)3.2.1 功能原理 (14)3.2.2 算法原理 (14)3.2.3 具体程序 (14)3.3 中序遍历 (15)3.3.1 功能原理 (15)3.3.2 算法原理 (15)3.3.3 具体程序 (15)3.4 后序遍历 (16)3.4.1功能原理 (16)3.4.2 算法原理 (16)3.4.3 具体程序 (17)3.5层次序非递归遍历 (18)3.5.1 功能原理 (18)3.5.2 算法原理 (18)3.5.3 具体程序 (18)3.6 栈结构 (19)3.6.1 功能原理 (19)3.6.2算法原理 (19)3.6.3 具体程序 (19)3.7 队列结构 (20)3.7.1 功能原理 (20)3.7.2 算法原理 (20)3.7.3 具体程序 (20)4调试与操作说明 (21)致谢 (24)参考文献 (25)附录: (26)1需求分析1.1二叉树与树结构树结构的是建立在数据逻辑结构基础上的数据结构类型,二叉树则是树结构中最常见和使用最多的类型。

计算二叉树的叶子结点个数 c语言

计算二叉树的叶子结点个数 c语言

计算二叉树的叶子结点个数 c语言计算二叉树的叶子节点个数二叉树是一种常见的数据结构,它由节点和连接节点的边组成。

在二叉树中,每个节点最多有两个子节点,分别称为左子节点和右子节点。

叶子节点是指没有子节点的节点,也可以称为终端节点。

在计算二叉树的叶子节点个数时,我们需要遍历整个二叉树,统计叶子节点的数量。

为了更好地理解如何计算二叉树的叶子节点个数,我们首先需要了解二叉树的遍历方式。

常见的遍历方式有三种:前序遍历、中序遍历和后序遍历。

在前序遍历中,我们先访问根节点,然后递归地遍历左子树和右子树。

在中序遍历中,我们先递归地遍历左子树,然后访问根节点,最后遍历右子树。

在后序遍历中,我们先递归地遍历左子树和右子树,最后访问根节点。

对于计算二叉树的叶子节点个数,我们可以使用递归的方法。

递归是一种在函数中调用自身的技术。

我们可以定义一个递归函数来计算二叉树的叶子节点个数。

具体的算法如下:1. 如果二叉树为空,则叶子节点个数为0;2. 如果二叉树只有一个节点,则叶子节点个数为1;3. 否则,叶子节点个数等于左子树的叶子节点个数加上右子树的叶子节点个数。

根据上述算法,我们可以编写如下的C语言代码来计算二叉树的叶子节点个数:```c#include <stdio.h>#include <stdlib.h>// 定义二叉树节点的结构体typedef struct TreeNode {int val;struct TreeNode* left;struct TreeNode* right;} TreeNode;// 递归计算二叉树的叶子节点个数int countLeafNodes(TreeNode* root) {// 如果二叉树为空,返回0if (root == NULL) {return 0;}// 如果二叉树只有一个节点,返回1if (root->left == NULL && root->right == NULL) {return 1;}// 递归计算左子树的叶子节点个数int leftCount = countLeafNodes(root->left);// 递归计算右子树的叶子节点个数int rightCount = countLeafNodes(root->right);// 返回左子树和右子树的叶子节点个数之和return leftCount + rightCount;}int main() {// 创建二叉树TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode)); root->val = 1;root->left = (TreeNode*)malloc(sizeof(TreeNode));root->left->val = 2;root->left->left = NULL;root->left->right = NULL;root->right = (TreeNode*)malloc(sizeof(TreeNode));root->right->val = 3;root->right->left = NULL;root->right->right = NULL;// 计算二叉树的叶子节点个数int count = countLeafNodes(root);printf("二叉树的叶子节点个数为:%d\n", count);// 释放二叉树的内存free(root->left);free(root->right);free(root);return 0;}```在上述代码中,我们首先定义了一个二叉树节点的结构体,并且使用malloc函数动态分配了二叉树的内存空间。

二叉树的遍历代码

二叉树的遍历代码

二叉树的遍历代码二叉树是一种非常常见的数据结构,它由根节点、左子树和右子树组成,可以用于实现各种算法和应用。

在使用二叉树时,我们常常需要进行遍历来获取树中的节点信息。

下面,我们将详细介绍二叉树的遍历方法及其代码实现。

二叉树的遍历方法分为三种:前序遍历、中序遍历和后序遍历。

它们的不同之处在于遍历节点的顺序不同。

我们分别来介绍一下这三种遍历方法。

1.前序遍历前序遍历的顺序是:先访问根节点,然后递归访问左子树和右子树。

实现前序遍历的代码如下:```pythondef preorder_traversal(node):if node:print(node.data)preorder_traversal(node.left)preorder_traversal(node.right)```在代码中,我们首先输出根节点的值,然后分别递归访问左子树和右子树,直到遍历完整个树。

2.中序遍历中序遍历的顺序是:先递归访问左子树,然后访问根节点,最后递归访问右子树。

实现中序遍历的代码如下:```pythondef inorder_traversal(node):if node:inorder_traversal(node.left)print(node.data)inorder_traversal(node.right)```在代码中,我们先递归访问左子树,然后输出根节点的值,最后递归访问右子树。

3.后序遍历后序遍历的顺序是:先递归访问左子树和右子树,然后访问根节点。

实现后序遍历的代码如下:```pythondef postorder_traversal(node):if node:postorder_traversal(node.left)postorder_traversal(node.right)print(node.data)```在代码中,我们先递归访问左子树和右子树,然后输出根节点的值。

通过前序遍历、中序遍历和后序遍历,我们可以获取二叉树中每个节点的值。

数据结构——用C语言描述(第3版)教学课件第6章 树与二叉树

数据结构——用C语言描述(第3版)教学课件第6章 树与二叉树

6.2 二叉树 6.2.1 二叉树的定义与基本操作 6.2.2 二叉树的性质 6.2.3 二叉树的存储结构
6.2.1 二叉树的定义与基本操作 定义:我们把满足以下两个条件的树型结构叫做二 叉树(Binary Tree): (1)每个结点的度都不大于2; (2)每个结点的孩子结点次序不能任意颠倒。
有序树:在树T中,如果各子树Ti之间是有先后次序的,则称为有序树。 森林:m(m≥0)棵互不相交的树的集合。将一棵非空树的根结点删去,树就变成一 个森林;反之,给森林增加一个统一的根结点,森林就变成一棵树。
同构:对两棵树,通过对结点适当地重命名,就可以使两棵树完全相等(结点对应相 等,对应结点的相关关系也像等),则称这两棵树同构。
二叉树的基本结构由根结点、左子树和右子树组成
如图示
LChild Data RChild
Data
LChild RChild
用L、D、R分别表示遍历左子树、访问根结点、遍 历右子树,那么对二叉树的遍历顺序就可以有:
(1) 访问根,遍历左子树,遍历右子树(记做DLR)。 (2) 访问根,遍历右子树,遍历左子树(记做DRL)。 (3) 遍历左子树,访问根,遍历右子树(记做LDR)。 (4) 遍历左子树,遍历右子树,访问根 (记做LRD)。 (5) 遍历右子树,访问根,遍历左子树 (记做RDL)。 (6) 遍历右子树,遍历左子树,访问根 (记做RLD)。
(8) NextSibling(Tree,x): 树Tree存在,x是Tree中的某个结点。若x不 是其双亲的最后一个孩子结点,则返回x后面的下一个兄弟结点,否则 返回“空”。
基本操作:
(9) InsertChild(Tree,p,Child): 树Tree存在,p指向Tree 中某个结点,非空树Child与Tree不相交。将Child插入Tree中, 做p所指向结点的子树。

二叉树c语言的程序代码

二叉树c语言的程序代码

# include "stdio.h"# include "stdlib.h"# include "malloc.h"typedef struct Node{char data; //定义根结点struct Node *lchild; //定义左子树struct Node *rchild; //定义右子树}Node,*BiTree;int JianShu(BiTree &T) { //构造二叉链表表示的二叉树T,按先序遍历输入二//叉树中结点的值(一个字符),空格字符表示空树.char e;T=(Node *)malloc(sizeof(Node)); //开辟一个以sizeof(Node)为单位的空间if(!T) //开辟失败exit (-2);fflush(stdin); //清空缓存scanf ("%c",&e);if(e==' ')T=NULL;else {T->data=e; // 生成根结点printf ("请输入%c的左孩子:",e);JianShu(T->lchild); // 构造左子树printf ("请输入%c的右孩子:",e);JianShu(T->rchild); // 构造右子树}return 1;}int DLR_P(BiTree &T) { //先序遍历打印二叉树中所有数据if (T!=NULL) { //非空二叉树printf ("%c ",T->data); //访问TDLR_P(T->lchild); //递归遍历左子树DLR_P(T->rchild); //递归遍历右子树}return 1;}int LDR_P(BiTree &T) { //中序遍历打印二叉树中所有数据if (T!=NULL) { //非空二叉树LDR_P(T->lchild); //递归遍历左子树printf ("%c ",T->data); //访问TLDR_P(T->rchild); //递归遍历右子树}return 1;}int LRD_P(BiTree &T) { //后序遍历打印二叉树中所有数据if (T!=NULL) { //非空二叉树LRD_P(T->lchild); //递归遍历左子树LRD_P(T->rchild); //递归遍历右子树printf ("%c ",T->data); //访问T}return 1;}int DLR_0(BiTree &T,int &s_0) { //用先序遍历求二叉树T中所有叶子总数if (T!=NULL) { //非空二叉树if(!T->lchild&&!T->rchild) { //判断该结点是否为叶子s_0++; //是叶子则计数并打印printf ("%c ",T->data);}DLR_0(T->lchild,s_0); //递归遍历左子树,直到叶子处DLR_0(T->rchild,s_0); //递归遍历右子树,直到叶子处}return s_0;}int DLR_1(BiTree &T,int &s_1) { //用先序遍历求二叉树T中所有1度结点总数if (T!=NULL) { //非空二叉树if(T->lchild&&!T->rchild) { //判断该结点是否为1度结点s_1++; //是1度结点则计数并打印printf ("%c ",T->data);}if(!T->lchild&&T->rchild) { //判断该结点是否为1度结点s_1++; //是1度结点则计数并打印printf ("%c ",T->data);}DLR_1(T->lchild,s_1); //递归遍历左子树,直到1度结点处DLR_1(T->rchild,s_1); //递归遍历右子树,直到1度结点处}return s_1;}int DLR_2(BiTree &T,int &s_2) { //用先序遍历求二叉树T中所有2度结点总数if (T!=NULL) { //非空二叉树if(T->lchild&&T->rchild) { //判断该结点是否为2度结点s_2++; //是2度结点则计数并打印printf ("%c ",T->data);}DLR_2(T->lchild,s_2); //递归遍历左子树,直到2度结点处DLR_2(T->rchild,s_2); //递归遍历右子树,直到2度结点处}return s_2;}int ShenDu(BiTree &T,int l,int &h) { //用递归求二叉树的深度if (T!=NULL) { //非空二叉树l=l+1;if (l>h) h=l;ShenDu(T->lchild,l,h); //递归遍历左子树ShenDu(T->rchild,l,h); //递归遍历右子树}return 1;}int QingKong(BiTree &T) { //清空二叉树if (T!=NULL) {QingKong(T->lchild); //遍历清空左子树free(T->lchild);QingKong(T->rchild); //遍历清空右子树free(T->rchild);}return 1;}int main () { //主函数int i,a=0;Node *T; //定义一个二叉树Twhile(1) {system("cls");printf("\t|===========================================================|\t\n");printf ("\t| |\t\n");printf ("\t| 二叉树的链式存储|\t\n");printf ("\t| |\t\n");printf("\t|===========================================================|\t\n");printf ("\n\t【1】建立二叉树及先序输入!\t 【2】遍历二叉树打印!\n");printf ("\n\t【3】打印各结点并统计! \t 【4】求二叉树的深度!\n");printf ("\n\t【5】清空二叉树!\t\t 【0】退出程序!\n");system("color F0");printf ("\n\n\t\t\t请输入你的选择:"); //输入选择的功能序号scanf ("%d",&i);switch(i) {case 1: //建立二叉树T并输入数据printf ("请输入二叉树T的根:");JianShu(T);a=1;system("pause");break;case 2: //遍历打印二叉树中所有数据if(a==1) {if(T!=NULL) { //非空二叉树Tprintf ("先序遍历打印结果:"); //执行先序遍历并打印DLR_P(T);printf ("\n\n中序遍历打印结果:"); //执行中序遍历并打印LDR_P(T);printf ("\n\n后序遍历打印结果:"); //执行后序遍历并打印LRD_P(T);printf ("\n");}elseprintf ("二叉树T为空树!\n");}else //未建立二叉树printf ("未建立二叉树!\n");system("pause");break;case 3: //先序遍历打印二叉树中0度1度2度结点if(a==1) {if(T!=NULL) { //非空二叉树Tint s_0=0,s_1=0,s_2=0;printf ("二叉树中叶子:");DLR_0(T,s_0); //执行先序遍历打印叶子并统计printf ("共有%d个叶子!\n",s_0);printf ("\n二叉树中1度结点:");DLR_1(T,s_1); //执行先序遍历打印1度结点并统计printf ("共有%d个1度结点!\n",s_1);printf ("\n二叉树中2度结点:");DLR_2(T,s_2); //执行先序遍历打印2度结点并统计printf ("共有%d个2度结点!\n",s_2);}elseprintf ("二叉树T为空树!\n");}else //未建立二叉树printf ("未建立二叉树!\n");system("pause");break;case 4: //用递归求二叉树的深度if(a==1) {if(T!=NULL) { //非空二叉树Tint l=0,h=0;ShenDu(T,l,h);printf ("二叉树的深度为%d.\n",h);}elseprintf ("二叉树T为空树!\n");}else //未建立二叉树printf ("未建立二叉树!\n");system("pause");break;case 5: //清空二叉树if(a==1) {if(T!=NULL) { //非空二叉树QingKong(T); //清空二叉树T=NULL;printf ("二叉树已清空!\n");}elseprintf ("二叉树T为空树,既不用清空!\n");}else //未建立二叉树printf ("未建立二叉树,既不用清空!\n");system("pause");break;case 0: //退出程序printf ("退出程序!\n");return 1;default: //重新输入选择的功能序号printf ("输入有误,请重新输入!\n");system("pause");break;}}}。

c++实现树(二叉树)的建立和遍历算法(一)(前序,中序,后序)

c++实现树(二叉树)的建立和遍历算法(一)(前序,中序,后序)

c++实现树(⼆叉树)的建⽴和遍历算法(⼀)(前序,中序,后序)最近学习树的概念,有关⼆叉树的实现算法记录下来。

不过学习之前要了解的预备知识:树的概念;⼆叉树的存储结构;⼆叉树的遍历⽅法。

⼆叉树的存储结构主要了解⼆叉链表结构,也就是⼀个数据域,两个指针域,(分别为指向左右孩⼦的指针),从下⾯程序1,⼆叉树的存储结构可以看出。

⼆叉树的遍历⽅法:主要有前序遍历,中序遍历,后序遍历,层序遍历。

(层序遍历下⼀篇再讲,本篇主要讲的递归法)下篇主要是,之后会有c++模板实现和。

如这样⼀个⼆叉树:它的前序遍历顺序为:ABDGHCEIF(规则是先是根结点,再前序遍历左⼦树,再前序遍历右⼦树)它的中序遍历顺序为:GDHBAEICF(规则是先中序遍历左⼦树,再是根结点,再是中序遍历右⼦树)它的后序遍历顺序为:GHDBIEFCA(规则是先后序遍历左⼦树,再是后序遍历右⼦树,再是根结点)如果不懂的话,可以参看有关数据结构的书籍。

1,⼆叉树的存储结构(⼆叉链表)//⼆叉树的⼆叉链表结构,也就是⼆叉树的存储结构,1个数据域,2个指针域(分别指向左右孩⼦)typedef struct BiTNode{ElemType data;struct BiTNode *lchild, *rchild;}BiTNode, *BiTree;2,⾸先要建⽴⼀个⼆叉树,建⽴⼆叉树必须要了解⼆叉树的遍历⽅法。

//⼆叉树的建⽴,按前序遍历的⽅式建⽴⼆叉树,当然也可以以中序或后序的⽅式建⽴⼆叉树void CreateBiTree(BiTree *T){ElemType ch;cin >> ch;if (ch == '#')*T = NULL; //保证是叶结点else{*T = (BiTree)malloc(sizeof(BiTNode));//if (!*T)//exit(OVERFLOW); //内存分配失败则退出。

C语言实现二叉树的中序遍历(递归)

C语言实现二叉树的中序遍历(递归)
c语言实现二叉树的中序遍历(递归) 二叉树的前序遍历,中序遍历,后续遍历 (包括递归,非递归,共六种) 1,中序遍历(递归): #include #include struct bitnode//定义结构体 { char data; struct bitnode *lchild,*rchild; }; void later(struct bitnode *&amp;p) //前序创建树 { char ch; scanf("%c",&amp;ch); if(ch==' ') p=null; else { p=(struct bitnode *)malloc(sizeof(struct bitnode)); p->data=ch; later(p->lchild); later(p->rchild); } } void print(struct bitnode *p) //中序遍历(输出二叉树) { if(p!=null) { print(p->lchild); printf("%c",p->data); print(p->rchild); } else printf(" "); } void main()//主函数 { struct bitnode *p; later(p); print(p); } 供测试使用的数据
C语 言 实 现 二 叉 树 的 中 序 遍 历 ( 递 归 )
二叉树的前序遍历、中序遍历、后续遍历 (包括递归、非递归,共六种) 1、中序遍历(递归): #include #include struct BiTNode//定义结构体 { char data; struct BiTNode *lchild,*rchild; }; void later(struct BiTNode *&p) //前序创建树 { char ch; scanf("%c",&ch); if(ch==' ') p=NULL; else { p=(struct BiTNode *)malloc(sizeof(struct BiTNode)); p->data=ch; later(p->lchild); later(p->rchild); } } void print(struct BiTNode *p) //中序遍历(输出二叉树) { if(p!=NULL) { print(p->lchild); printf("%c",p->data); print(p->rchild); } else printf(" ");

浅析一种二叉树非递归遍历算法的C语言实现论文.doc

浅析一种二叉树非递归遍历算法的C语言实现论文.doc

浅析一种二叉树非递归遍历算法的C语言实现论文一种二叉树非递归遍历算法的C语言实现论文导读:本论文是一篇关于一种二叉树非递归遍历算法的C语言实现的优秀论文范文,对正在写有关于递归论文的写有一定的参考和指导作用,摘要:针对二叉树的链式存储结构,分析了二叉树的各种遍历算法,探讨了递归算法的递推消除理由,提出了一种改善的非递归遍历算法并用C语言予以实现。

关键词:二叉树;遍历算法;非递归;C语言实现1009-3044(2014)01-0223-031 概述树形结构是一种非常常见的数据结构,而二叉树又是其中最重要的一种树形结构。

二叉树的遍历是指按照一定的规则和次序将二叉树中的每一个结点都访问一次,既不能重复,也不能漏掉。

一般而言,对二叉树的遍历有前序遍历、中序遍历、后序遍历和按层遍历等几种方式。

在具体的算法设计上,以上遍历方式一般采取递归算法来实现,该文将探讨采用非递归算法来实现二叉树的遍历。

2 二叉树的数据结构描述二叉树作为一种非线性结构,每个结点最多有一个双亲结点和两个子结点。

二叉树可以采用顺序存储结构和链式存储结构。

对于完全二叉树而言,采用顺序存储是非常方便并且节省空间的,但是对于大部分的非完全二叉树而言,采用顺序存储将导致空间浪费严重且结构混乱、效率低下。

因此,更多的时候,大家都更愿意用链式存储结构来表示二叉树,这样结构更加清晰,尤其是对于一种二叉树非递归遍历算法的C语言实现由写论文的好帮手.zbjy.提供,.左右子树的描述和双亲节点的描述更加方便。

该文中拟采用链式结构来表示二叉树。

用链式存储结构来表示二叉树,一个结点至少由3个域组成,即数据域、左子结点域和右子结点域(如图1所示)。

3 二叉树的遍历及递归算法实现3.1 二叉树的遍历二叉树的遍历就是一个不漏的访问树中的每个结点,同时也不能重复。

所谓“访问”,就是指对结点的数据域进行某种操作,比如说读取、删除、更新、求该节点深度等等。

对于二叉树中的任意一个部分,都可以把它看作三部分,根节点、左子树、右子树,我们用D表示访问跟结点,用L表示遍历左子树,用R表示遍历右子树,则共有以下6种遍历方式[1]。

二叉树的顺序存储结构代码

二叉树的顺序存储结构代码

二叉树的顺序存储结构代码介绍二叉树是一种常用的数据结构,它由节点组成,每个节点最多有两个子节点。

在计算机中,我们通常使用顺序存储结构来表示二叉树。

顺序存储结构是将二叉树的节点按照从上到下、从左到右的顺序依次存储在一个数组中。

本文将详细介绍二叉树的顺序存储结构代码,包括初始化、插入节点、删除节点以及遍历等操作。

二叉树的顺序存储结构代码实现初始化二叉树首先,我们需要定义一个数组来存储二叉树的节点。

假设数组的大小为n,则二叉树的最大节点数量为n-1。

# 初始化二叉树,将数组中所有元素置为空def init_binary_tree(n):binary_tree = [None] * nreturn binary_tree插入节点在二叉树的顺序存储结构中,节点的插入操作需要保持二叉树的特性,即左子节点小于父节点,右子节点大于父节点。

插入节点的算法如下:1.找到待插入位置的父节点索引parent_index。

2.如果待插入节点小于父节点,将其插入到父节点的左子节点位置,即数组索引2*parent_index+1处。

3.如果待插入节点大于父节点,将其插入到父节点的右子节点位置,即数组索引2*parent_index+2处。

# 插入节点def insert_node(binary_tree, node):index = 0 # 当前节点的索引值,初始值为根节点的索引值while binary_tree[index] is not None:if node < binary_tree[index]:index = 2 * index + 1 # 插入到左子节点else:index = 2 * index + 2 # 插入到右子节点binary_tree[index] = node删除节点删除节点需要保持二叉树的特性,即在删除节点后,仍然满足左子节点小于父节点,右子节点大于父节点的条件。

删除节点的算法如下:1.找到待删除节点的索引delete_index。

用C语言编写二叉树的建立与遍历

用C语言编写二叉树的建立与遍历

用C语言编写二叉树的建立与遍历1.对题目要有需求分析在需求分析中,将题目中要求的功能进行叙述分析,并且设计解决此问题的数据存储结构,设计或叙述解决此问题的算法。

给出实现功能的一组或多组测试数据,程序调试后,将按照此测试数据进行测试的结果列出来。

如果程序不能正常运行,写出实现此算法中遇到的问题和改进方法;2.对题目要有相应的源程序源程序要按照写程序的规则来编写。

要结构清晰,重点函数的重点变量,重点功能部分要加上清晰的程序注释。

(注释量占总代码的四分之一)程序能够运行,要有基本的容错功能。

尽量避免出现操作错误时出现死循环;3.最后提供的主程序可以象一个应用系统一样有主窗口,通过主菜单和分级菜单调用课程设计中要求完成的各个功能模块,调用后可以返回到主菜单,继续选择其他功能进行其他功能的选择。

二叉树的建立与遍历[问题描述]建立一棵二叉树,并对其进行遍历(先序、中序、后序),打印输出遍历结果。

[基本要求]从键盘接受输入,以二叉链表作为存储结构,建立二叉树,并对其进行遍历(先序、中序、后序),将遍历结果打印输出。

以下是我的数据结构实验的作业:肯定好用,里面还包括了统计树的深度和叶子数!记住每次做完一个遍历还要重新输入你的树哦!#include "stdio.h"#include "string.h"#define NULL 0typedef struct BiTNode{char data;struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;BiTree Create(BiTree T){char ch;ch=getchar();if(ch=='#')T=NULL;else{if(!(T=(BiTNode *)malloc(sizeof(BiTNode))))printf("Error!");T->data=ch;T->lchild=Create(T->lchild);T->rchild=Create(T->rchild); }return T;}void Preorder(BiTree T){if(T){printf("%c",T->data); Preorder(T->lchild); Preorder(T->rchild);}}int Sumleaf(BiTree T){int sum=0,m,n;if(T){if((!T->lchild)&&(!T->rchild)) sum++;m=Sumleaf(T->lchild);sum+=m;n=Sumleaf(T->rchild);sum+=n;}return sum;}void zhongxu(BiTree T){if(T){zhongxu(T->lchild);printf("%c",T->data); zhongxu(T->rchild);}}void houxu(BiTree T){if(T){houxu(T->lchild);houxu(T->rchild);printf("%c",T->data);}}int Depth(BiTree T){int dep=0,depl,depr;if(!T) dep=0;else{depl=Depth(T->lchild);depr=Depth(T->rchild);dep=1+(depl>depr?depl:depr);}return dep;}main(){BiTree T;int sum,dep;T=Create(T);Preorder(T);printf("\n");zhongxu(T);printf("\n");houxu(T);printf("\n");sum=Sumleaf(T);printf("%d",sum);dep=Depth(T);printf("\n%d",dep);}在Turbo C的环境下,先按Ctrl+F9运行程序,此时就是建立二叉树的过程,例如输入序列ABC##DE#G##F###(其中的“#”表示空,并且输入过程中不要加回车,因为回车也有对应的ASCII码,是要算字符的,但是输入完之后可以按回车退出),然后再按ALT+F5显示用户界面,这时候就能够看到结果了。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

二叉树就是每个结点最多有两个子树的树形存储结构,所谓遍历二叉树,就是按一定的规则和顺序走遍二叉树的所有结点,使每一个结点都被且只被访问一次。

程序的流程图如下:
程序代码如下:
#include<iostream.h>
#include<stdlib.h>
#include<stdio.h>
#include<stdlib.h>
typedef char ElemType;
struct BTreeNode{
ElemType data;
BTreeNode*left;
BTreeNode*right;
};
void InitBTree(BTreeNode*& BT){ //初始化二叉树
BT=NULL;
}
void CreateBTree(BTreeNode*& BT,char*a){ //根据广义表表示的二叉树建立对应
的存储结构
const int MaxSize=10;
BTreeNode*s[MaxSize];
int top=-1;
BT=NULL;
BTreeNode*p;
int k;
int i=0;
while(a[i]){
switch(a[i]){
case ' ':
break;
case '(':
if(top==MaxSize-1){
printf("栈的空间太小,请增加MaxSize的值\n");
exit(1);
}
top++;
s[top]=p;
k=1;
break;
case ')':
if(top==-1){
printf("二叉树广义表字符串错!\n");
exit(1);
}
top--;
break;
case ',':
k=2;
break;
default:
p=new BTreeNode;
p->data=a[i];
p->left=p->right=NULL;
if(BT==NULL)
BT=p;
else{
if(k==1)
s[top]->left=p;
else
s[top]->right=p;
}
}
i++;
}
}
bool EmptyBTree(BTreeNode*BT){ //判断一棵二叉树是否为空,若是则返回ture,否则返回false
return BT==NULL;
}
int DepthBTree(BTreeNode*BT){
if(BT==NULL)
return 0;
else{
int dep1=DepthBTree(BT->left);
int dep2=DepthBTree(BT->right);
if(dep1>dep2)
return dep1+1;
else
return dep2+1;
}
}
bool FindBTree(BTreeNode*BT,ElemType&x){ //从二叉树中查找值为x的结点,若存在该结点则由x带回它的完整值
if(BT==NULL)
return false;
else{
if(BT->data==x){
x=BT->data;
return true;
}
else{
if(FindBTree(BT->left,x))
return true;
if(FindBTree(BT->right,x))
return true;
return false;
}
}
}
void PrintBTree(BTreeNode*BT){ //按照树的一种表示方法输出一棵二叉树if(BT!=NULL){
cout<<BT->data;
if(BT->left!=NULL||BT->right!=NULL){
cout<<'(';
PrintBTree(BT->left);
if(BT->right!=NULL)
cout<<',';
PrintBTree(BT->right);
cout<<')';
}
}
}
void ClearBTree(BTreeNode*&BT){ //清除二叉树中的所有结点,使之变为一棵空树
if(BT!=NULL){
ClearBTree(BT->left);
ClearBTree(BT->right);
delete BT;
BT=NULL;
}
}
void PreOrder(BTreeNode*BT){
if(BT!=NULL){
cout<<BT->data<<' ';
PreOrder(BT->left);
PreOrder(BT->right);
}
}
void InOrder(BTreeNode*BT){
if(BT!=NULL){
InOrder(BT->left);
cout<<BT->data<<' ';
InOrder(BT->right);
}
}
void PostOrder(BTreeNode*BT){
if(BT!=NULL){
PostOrder(BT->left);
PostOrder(BT->right);
cout<<BT->data<<' ';
}
}
void LevelOrder(BTreeNode*BT){ //按层遍历由BT指针所指向的二叉树const int MaxSize=30; //定义用于存储队列的数组长度
BTreeNode*q[MaxSize]; //定义队列所使用的数组空间
int front=0, rear=0; //定义队首指针和队尾指针,初始为空队
BTreeNode*p;
if(BT!=NULL){ //将树根指针进队
rear=(rear+1)%MaxSize;
q[rear]=BT;
}
while(front!=rear){ //当队列非空时执行循环front=(front+1)%MaxSize; //使队首指针指向队首元素
p=q[front]; //删除队首元素
cout<<p->data<<' '; //输出队首元素所指结点的值
if(p->left!=NULL){
rear=(rear+1)%MaxSize;
q[rear]=p->left;
}
if(p->right!=NULL){
rear=(rear+1)%MaxSize;
q[rear]=p->right;
}
} //while end//
}
void main(){
system("color 75"); //设置颜色以美观
BTreeNode*bt;
InitBTree(bt);
char b[999];
printf("输入二叉树广义表字符串:\n");
cin.getline(b,sizeof(b));
CreateBTree(bt,b);
PrintBTree(bt);
cout<<endl;
printf("递归算法遍历:\n");
cout<<"前序遍历为:";
PreOrder(bt);
cout<<endl;
cout<<"中序遍历为:";
InOrder(bt);
cout<<endl;
cout<<"后序遍历为:";
PostOrder(bt);
cout<<endl;
printf("非递归算法遍历:\n");
cout<<"按层遍历为:";
LevelOrder(bt);
cout<<endl;
ElemType x;
printf("请输入待查字符:");
scanf("%c",&x);
if(FindBTree(bt,x))
printf("查找字符%c成功",x);
else
printf("查找字符%c失败",x);
printf("\n");
cout<<" 树的深度为:";
cout<<DepthBTree(bt)<<endl;
ClearBTree(bt);
}
程序的运行结果如右图:。

相关文档
最新文档