输入某棵二叉树的广义表形式,建立该二叉树并按层次遍历该二叉树队列形式
二叉树的层次遍历算法

二叉树层次遍历算法实现问题描述对任意输入的表示某二叉树的字符序列,完成二叉树的层次遍历算法,并输出其遍历结果。
注:所需Queue ADT的实现见附录。
输入描述从键盘上输入一串字符串,该字符串为二叉树的先序遍历结果,其中如果遍历到空树时用字符”#”代替。
输出描述从显示器上输出二叉树的按层次遍历结果。
输入与输出示例输入:+A##/*B##C##D##输出:+A/*DBC输入:ABD##GJ###CFH##I###输出:ABCDGFJHI附录(仅供参考):#include<stdio.h>#include<malloc.h>#define TRUE 1#define FALSE 0#define MAX_QUEUE_SIZE 100//注:需要定义ElementType类型,如果是二叉树,// 则应定义为指向二叉树中结点的指针类型//格式如:// typedef Tree ElementType;// 队列存储结构采用循环队列struct QueueRecord;typedef struct QueueRecord *Queue;int IsEmpty(Queue Q);int IsFull(Queue Q);Queue CreateQueue(int MaxElements);void DisposeQueue(Queue Q);void MakeEmpty(Queue Q);int Enqueue(ElementType X, Queue Q);ElementType Front(Queue Q);int Dequeue(Queue Q, ElementType &X);#define MinQueueSize ( 5 )struct QueueRecord{int Capacity;int Front;int Rear;ElementType *Array;};int IsEmpty(Queue Q){return ((Q->Rear + 1)% Q->Capacity == Q->Front); }int IsFull(Queue Q){return ((Q->Rear + 2) % Q->Capacity == Q->Front); }Queue CreateQueue(int MaxElements){Queue Q;if (MaxElements < MinQueueSize)return NULL;Q = (Queue)malloc(sizeof(struct QueueRecord));if (Q == NULL) return NULL;Q->Array = (ElementType *)malloc(sizeof(ElementType) * MaxElements);if (Q->Array == NULL) return NULL;Q->Capacity = MaxElements;MakeEmpty(Q);return Q;}void DisposeQueue(Queue Q){if (Q != NULL){free(Q->Array);free(Q);}}void MakeEmpty(Queue Q){Q->Front = 1;Q->Rear = 0;}static int Succ(int Value, Queue Q){if (++Value == Q->Capacity)Value = 0;return Value;}int Enqueue(ElementType X, Queue Q){if (IsFull(Q)) return FALSE;else{Q->Rear = Succ(Q->Rear, Q);Q->Array[Q->Rear] = X;}}ElementType Front(Queue Q){if (IsEmpty(Q)) return FALSE;return Q->Array[Q->Front];}int Dequeue(Queue Q, ElementType &X){if (IsEmpty(Q)){return FALSE;}else{X = Q->Array[Q->Front];Q->Front = Succ(Q->Front, Q);}return TRUE;}。
二叉树的广义表表示法__概述及解释说明

二叉树的广义表表示法概述及解释说明1. 引言1.1 概述二叉树是一种常见的数据结构,在计算机科学中广泛应用。
为了有效地表示和操作二叉树,人们提出了各种表示方法。
其中,二叉树的广义表表示法是一种常用且灵活的方式。
1.2 文章结构本文将首先介绍二叉树的广义表表示法的定义和特点。
然后,我们将详细讨论广义表的表示方法,并解释广义表与二叉树之间的关系。
接下来,我们将介绍如何使用广义表表示方法构建二叉树,并讨论相应的转换方法。
最后,我们将探讨在广义表表示法下如何进行遍历和操作二叉树,并提供相应的实现方法和示例场景。
1.3 目的本文的目标是全面而清晰地介绍二叉树的广义表表示法,使读者对该方法有深入理解。
通过学习本文,读者将能够掌握如何使用广义表表示法构建和操作二叉树,并能够在实际问题中应用相关技巧。
同时,本文还旨在帮助读者提高对数据结构和算法相关知识的理解水平,并培养解决实际问题时分析和抽象的能力。
这样,我们完成了“1. 引言”部分的详细撰写。
2. 二叉树的广义表表示法2.1 定义和特点二叉树是一种常用的数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。
二叉树的广义表表示法是一种将二叉树以字符串形式进行表示的方法。
在广义表中,以括号形式将二叉树的节点和子树进行包裹,并使用逗号分隔各个元素。
2.2 广义表的表示方法广义表由以下部分组成:- 括号:用来包裹二叉树的节点和子树。
- 节点值:表示该节点存储的数据值。
- 逗号:用于分隔各个元素。
- 空格:可选,用于提高可读性。
例如,假设有一个二叉树如下所示:```A/ \B C/ \D E```它可以表示为广义表形式为:`(A, (B, (), ()), (C, (D, (), ()), (E, (), ())))`解释上述广义表:- `(A`代表当前节点的值为A。
- `(B, (), ())`代表当前节点的左子节点为空并且右子节点为空。
- `(C, (D, (), ()), (E, (), ()))`代表当前节点的左子节点为D、右子节点为E。
DS_上机实验的目的、要求和评分标准

上机实验的目的、要求和评分标准一、实验目的上机实践是各位对本门课程所学知识的一种全面、综合的能力训练,是与课堂听讲、自学和练习相辅相成的必不可少的一个教学环节,也是对课堂教学与实践教学效果的一种检验。
通常,实验题中的问题比平时的习题复杂得多,也更接近实际。
实验着眼于原理与应用的结合,使你们学会如何把书上学到的知识运用于解决实际问题的过程中去,培养从事软件开发设计工作所必需的基本技能;另一方面,能使书上的知识变“活”,起到深化理解和灵活掌握教学内容的目的。
平时的练习较偏重于如何编写功能单一的“小”算法,而实验题是软件设计的综合训练,包括问题分析(需求分析)、总体结构设计和用户界面设计(概要设计)、程序设计基本技能和技巧等,即一整套软件工程规范的训练和科学作风的培养。
此外,还有很重要的一点是:机器是比任何教师都严厉的主考者。
为了达到上述目的,本课程共安排了10个实验单元,各单元的训练重点在于基本的数据结构,而不强调面面俱到。
各实验单元与教科书的各章具有紧密的对应关系。
二、要求:⒈做好每一次上机前的准备以提高上机效率:①预先认真阅读相关实验内容,做到心中有明确的目的要求和任务,要有备而来,应该自己独立的思考和设计你的算法和程序,并争取在规定的时间内如期完成上机工作任务。
对于个别目前基础较差的同学,实在是没法完成任务的建议你先参考其他同学的算法,勤学好问,最终自己独立完成,以增强你的感性认识,强化你的实践基础,提高你的实践能力。
②按照实验内容规定的习题题目,事先在实验预习报告上编写好源程序及运行程序所需的典型数据,并经人工静态检查认为无误;手编程序应书写整齐,应在每个题目之间留出一定的空间,以备记录上机调试情况和运行结果等;对程序中自己有疑问的地方,应作出记号,以便上机时给以注意。
③将想要上机验证的问题草拟提纲;制定一个简捷的程序调试计划。
⒉上机时输入和调式自己所编写的程序。
对“出错信息”,应善于自己分析判断,并充分利用开发工具提供的错误信息和调试手段解决出现的问题,及时修改与完善算法、源程序,随时记录有价值的内容。
二叉树的广义表表示法

二叉树的广义表表示法什么是二叉树的广义表表示法二叉树是一种常用的数据结构,用于存储有层次关系的数据。
在二叉树的广义表表示法中,使用一种类似于表达式的方式来表示二叉树的结构,方便我们对二叉树进行操作和理解。
广义表表示法的定义方式在广义表表示法中,一个二叉树可以用一个字符串来表示。
字符串中的每个字符都代表二叉树的一个节点,字符的位置代表节点的位置关系。
具体表达方式如下:1.如果一个字符是空格或者#,表示该节点为空节点。
2.如果一个字符是字母或者数字,表示该字符对应的节点的值。
3.如果一个字符是(,表示这是一个节点的左子树的开始。
4.如果一个字符是),表示这是一个节点的左子树的结束。
5.如果一个字符是,,表示这是一棵树的左右子树的分界。
举例说明下面举一个例子来说明如何使用广义表表示法表示一个二叉树。
假设有如下二叉树:A/ \\B C/ \\D E使用广义表表示法来表示这个二叉树,可以得到如下字符串:A(B,#,#),C(D,#,E)解释一下这个字符串的含义:字符串的第一个字符是A,表示根节点的值是A。
字符串的第二个字符是(,表示接下来是根节点的左子树。
字符串的第三个字符是B,表示根节点的左子树的值是B。
字符串的第四个字符是,,表示根节点的左子树和右子树的分界。
字符串的第五个字符是#,表示根节点的右子树为空节点。
字符串的第六个字符是,,表示根节点的右子树和父节点的右子树的分界。
字符串的第七个字符是(,表示接下来是根节点的右子树。
字符串的第八个字符是D,表示根节点的右子树的值是D。
字符串的第九个字符是,,表示根节点的右子树的左右子树的分界。
字符串的第十个字符是E,表示根节点的右子树的右子树的值是E。
字符串的最后一个字符是),表示根节点的右子树的结束。
通过这个字符串,我们可以很清楚地看出二叉树的结构和节点之间的关系。
广义表表示法的优点广义表表示法具有以下几个优点:1.表达简洁:使用字符串作为表达方式,使得二叉树的结构一目了然。
二叉树的创建与遍历代码

二叉树的创建与遍历代码一、概述二叉树是一种常用的数据结构,具有广泛的应用。
在计算机科学中,二叉树是一种非线性的数据结构,由一组称为节点的元素组成,每个节点最多可以有两个子节点。
创建和遍历二叉树是二叉树操作的关键。
二、二叉树的创建创建二叉树有多种方式,常见的有手动创建和通过遍历方式创建。
下面分别介绍这两种方式:2.1 手动创建二叉树手动创建二叉树是指根据实际需求,手动输入节点值和节点关系来构建二叉树。
以下为手动创建二叉树的步骤:1.定义二叉树节点结构,包含节点值和左右子节点指针。
2.创建根节点,并输入根节点的值。
3.根据实际需求,逐级输入左右子节点的值,并将其与父节点相连。
4.重复步骤3,直到所有节点都输入完毕。
手动创建二叉树的代码示例:class BinTreeNode:def __init__(self, value):self.value = valueself.left = Noneself.right = Nonedef build_binary_tree():root_value = input("请输入根节点的值:")root = BinTreeNode(root_value)nodes = [root] # 存储待连接的节点while nodes:parent = nodes.pop(0)left_value = input("请输入节点" + parent.value + "的左子节点的值(没有请输入None):")if left_value != "None":left = BinTreeNode(left_value)parent.left = leftnodes.append(left)right_value = input("请输入节点" + parent.value + "的右子节点的值(没有请输入None):")if right_value != "None":right = BinTreeNode(right_value)parent.right = rightnodes.append(right)return root# 创建二叉树root = build_binary_tree()2.2 遍历方式创建二叉树遍历方式创建二叉树是指通过遍历给定的序列(如前序遍历或层次遍历),逐个节点创建二叉树。
利用队列实现二叉树的层次遍历

实验三利用队列实现二叉树的层次遍历实验目的(1)掌握利用二叉树的递归结构性质建立二叉链表(2)掌握循环队列的基本算法(3)掌握二叉树的遍历算法实验环境(1)Windows 2000,或WindowsXP(简体中文)(2)Visual C++ 6.0,或C++ Builder 6.0操作系统环境和编程环境(集成开发环境)任选以上所列之一。
实验内容设计一个利用队列实现二叉树层次遍历的程序。
假设二叉树结点的元素数据类型为字符型,二叉树以二叉链表存储。
利用二叉树的递归结构性质,通过读取键盘输入的如图所示二叉树的先序序列,建立其二叉链表。
实现步骤:以C++ Builder环境为例,实现步骤如下:1.新建一个Win32 Console Application程序项目。
2.在代码编辑窗口编写程序代码,含义如注释说明:#include <iostream.h>#include <conio.h>#define maxlen 10 // 定义循环队列的数组大小typedefstruct node{ char data;struct node *lp, *rp;}bt_node; // 二叉链表结点类型typedefstruct qnode{ bt_node *data[maxlen];int front, rear;}queue; // 队列数据类型void init_queue(queue &q) // 初始化队列函数{ q.front=0;q.rear=0;}int empty_queue(const queue &q) // 判队空函数{ if(q.front==q.rear) return 1;return 0;}int into_queue(queue &q, bt_node *bp) // 入队函数{ if((q.rear+1)%maxlen==q.front) return 0;q.rear=(q.rear+1)%maxlen;q.data[q.rear]=bp;return 1;}bt_node *out_queue(queue &q) // 出队函数{// if(empty_queue(q)) return NULL;q.front=(q.front+1)%maxlen;return q.data[q.front];}bt_node *create_btree() // 建立二叉链表函数{/* 读取一个元素符号;若为空元素(以特殊字符表示), 则返回空地址;否则, 申请二叉链表新结点, 将元素符号写入该结点, 递归建立其左子树和右子树, 并返回该结点地址*/char c;c=cin.get();if(c=='_')return NULL;bt_node *p = new bt_node;p->data = c;p->lp = create_btree();p->rp = create_btree();return p;}void visit(char c) // 访问元素函数{ cout<<c<<' ';}void bt_travel_width_first(bt_node *bp) // 层次遍历二叉链表函数{/* 初始化队列;若bp非空则bp入队;当队列非空, 重复下列操作:{ 出队;访问出队指针所指结点的元素;若该结点左指针非空则入队;若该结点右指针非空则入队;}*/queue treequeue;init_queue(treequeue);if(empty_queue(treequeue))into_queue(treequeue, bp) ;while(!empty_queue(treequeue)){bt_node *p = new bt_node;p = out_queue(treequeue);cout << p->data << ' ';if(p>lp!=NULL)into_queue(treequeue, p->lp) ;if(p->rp!=NULL)into_queue(treequeue, p->rp) ;}}void main(){ bt_node *Bp; // 指向二叉树根结点的指针cout<<"Input a bitree node in root-first order: \n";Bp=create_btree();cout<<"the sequence of traveling in width-first order: "<<endl;bt_travel_width_first(Bp);cout<<endl;getch();}3.保存程序项目。
证明非叶子结点中有m-1个结点的度为2,其余度为1。2、
作业: 1、如果一棵Huffman树T有n0个叶子结点,那么,树T有多少个结 点?给出求解过程。 提示:Huffman树只有度为2和0的结点,又n0=n2+1,n=no+n2 故:n=2n0-1 2、有7个带权结点,其权值分别为3,7,8,2,6,10,14,试以 它们为叶子结点构造一棵Huffman树,并计算带权路径长度。 3、在一份电文中共使用了五种字符,即a,b,c,d,e,它们的出现频率 依次为4,7,5,2,9,试画出对应的Huffman树,并求出每个字符的 Huffman编码。
??????????????6??3??0?1010??????6600339530???????????2014916??????????????????????????4?10?7?0???9???????????070565034065??????1给出在该图上从顶点1出发进行dfs遍历的结果序列并根据此判断该图是否为连通图
2014-9-5
练习:根据图的邻接矩阵画出图
5 0 12 3 8 6 20 7 12 0 3 6 0 15 8 20 15 0
0
5
7
0
6
int NodeLevel(BTree *bt,ElemType X) { if (bt==NULL) return 0; //空树层号为0 else if (bt->data==X) return 1; //根结点层号为1 else { int c1=NodeLevel(bt->left,X); if (c1>=1) _____(1)_____; c1++; int c2=NodeLevel(bt->right,X); c2++; if (c2>=1) _____(2)_______; if ____(3)______; (c1>=1 || c2>=1) return c1>c2?c1:c2 else return 0; //若树中不存在X,则返回0 } }
输入某棵二叉树的广义表形式,建立该二叉树并按层次遍历该二叉树队列形式
掌握二叉树的二叉链表存储结构;掌握二叉树的遍历规则;利用二叉树的二叉链表存储结构实现二叉树的建树操作;利用二叉树的二叉链表存储结构实现二叉树层次遍历操作二叉树采用二叉链表结构表示。
设计并实现如下算法:输入某棵二叉树的广义表形式,建立该二叉树,并按层次遍历该二叉树----队列形式#include <stdio.h>#include <stdlib.h>#include <malloc.h>#define STACK_MAX_SIZE 30#define QUEUE_MAX_SIZE 30typedef struct BitNode{char data;struct BitNode *lchild;struct BitNode *rchild;}BitNode,*BiTree;;typedef struct node{BitNode *data;}node,*queue;typedef struct Queue{ node *base;int front;int rear;}Queue;void InitQueue(Queue *Q){ Q->base=(queue)malloc(QUEUE_MAX_SIZE*sizeof(node)); Q->front=Q->rear=0;}int EmptyQueue(Queue *Q){ if(Q->front==Q->rear)return 1;elsereturn 0;}void EnQueue(Queue *Q,BitNode *e) { Q->base[Q->rear].data=e; Q->rear++;}BiTree DeQueue(Queue *Q){int m;m=Q->front;Q->front++;return (Q->base[m].data);}char a[50];BiTree CreatBiTree(BiTree T){BiTree p;BiTree s[STACK_MAX_SIZE];int top = -1;int flag;int i = 0;T=NULL;while(a[i]!='#'){switch(a[i]){case' ':break;case '(':top++;s[top] = p;flag = 1;break;case ')':top--;break;case ',': flag = 0; break;default: p = (BitNode *)malloc(sizeof(BitNode)); p->data = a[i];p->lchild = p->rchild = NULL; if(T==NULL){ T=p; }else{ if( flag == 1){ s[top]->lchild = p; }else { s[top]->rchild = p; } }}i++;}return T;}void LevelOrder(BiTree T) { Queue l;Queue *Q=&l;BiTree p;InitQueue(Q);if(T){EnQueue(Q,T);while(!EmptyQueue(Q)){ p=DeQueue(Q);printf("%c",p->data);if(p->lchild)EnQueue(Q,p->lchild);if(p->rchild)EnQueue(Q,p->rchild);}}}void main(){BitNode *T;printf("please input the Generalized list: \n");gets(a);T=CreatBiTree(T);printf("the order is:\n"); LevelOrder(T);getch();}。
二叉树的建立与遍历
重庆高校本科同学课程设计任务书数据结构:给出所使用的基本抽象数据类型,所定义的详细问题的数据类型, 以及新定义的抽象数据类型。
void recursive_insert(Binary_node<Entry> * &sub_root,const Entry &x);void recursive_postorder(Binary_node<Entry> *sub_root, void (*visit)(Entry &));void recursive_preorder(Binary_node<Entry> 水SUb_root,VOid (*visit)(Entry &));void recursive_inorder(Binary_node<Entry> *sub_roo LVoid (*visit)(Entry &));void recursive_clear(Binary_node<Entry> * &sub_root);Binary-node<Entry> * recursive_copy(Binary_node<Entry> *sub_root);};cpp2.cpp#include"cppl.cpp"#include<iostream>using namespace std;template <class Entry>int Binary-tree<Entry> :: height() const∕* Post: The height of the binary tree is returned. */(return recursive_height(root);1template <class Entry>int Binary_tree<Entry>::recursive_height(Binary_node<Entry> *sub_root) const ∕* Post: The height of the subtree rooted at sub_root is returned. */ (if(sub_root==0)return O;int L=recursive_height(sub_root->left);int R=recursive_height(sub_root->right);if(L>R)return 1+L;elsereturn 1+R;}template<class Entry>Binary-node<Entry>::B inary_node(const Entry &x)(data=x;Ieft=O;right=O;template <class Entry>void Binary_tree<Entry>::insert(const Entry &x)∕* Post: The Entry x is added to the binary tree. */(recursive_insert(root, x);1template <class Entry>void Binary_tree<Entry> ::recursive_insert(Binary_node<Entry> * &sub_root,const Entry &x) ∕* Pre: sub_root is either NULL or points to a subtree of the Binary_tree.Post: The Entry x has been inserted into the subtree in such a way that the properties of a binary search tree have been presen,ed.Uses: The functions recursive_insert, recursive_height */(if (sub_root==0)sub_root=new Binary-node<Entry>(x);elseif (recursive_height(sub_root->right)<recursive_height(sub_root->left))recursive_insert(sub_root->right, x);elserecursive_insert(sub_root->left, x);1template <class Entry>Binary_tree<Entry>::Binary_tree()∕*Post: An empty binary tree has been created.*/(root=0;template <class Entry>bool BinarjMree<Entry>ιιempty() const∕*Post: A result of true is returned if the binary tree is empty. Otherwise, false is returned.*/(return root==0;template <class Entry>void Binar)Mree<Entry>"recursive-clear(Binary-node<Entry> * &sub_root) ∕* Post: The subtree rooted at sub_root is cleared. */(Binary-node<Entry> *temp = sub_root;if (sub root ==0) return;Binary_tree<Entry> new_copy(original); clear();root = new_copy.root;new_copy.root = 0;return *this;1cpp3.cpptypedefchar type;#include"cpp2.cpp"#include<iostream>using namespace std;void visitvisit(type &x);int main() (COUt<v"输°?入“?数°y据Y 个?数°y"v<endl;Binary_tree<type> mytree;int n;cin>>n;COUt<<endl<v"以。
二叉树的层次遍历c语言代码
二叉树的层次遍历c语言代码二叉树是一种非常常见的数据结构,它的遍历方式有很多种,其中层次遍历是一种比较常用的方式。
层次遍历是从根节点开始,按照从上到下、从左到右的顺序遍历整个二叉树。
在c语言中,我们可以通过使用队列来实现二叉树的层次遍历。
我们需要定义一个二叉树的结构体,包含左右子树指针和节点值:```typedef struct TreeNode {int val;struct TreeNode *left;struct TreeNode *right;} TreeNode;```接下来,我们需要定义一个队列的结构体,包含队列的头尾指针和队列的大小:```typedef struct Queue {TreeNode **data;int front;int rear;int size;} Queue;```然后,我们需要实现队列的初始化、入队、出队和判断队列是否为空的函数:```Queue *createQueue(int size) {Queue *queue = (Queue *)malloc(sizeof(Queue));queue->data = (TreeNode **)malloc(sizeof(TreeNode *) * size);queue->front = 0;queue->rear = -1;queue->size = 0;return queue;}void enqueue(Queue *queue, TreeNode *node) {queue->rear++;queue->data[queue->rear] = node;queue->size++;}TreeNode *dequeue(Queue *queue) {TreeNode *node = queue->data[queue->front]; queue->front++;queue->size--;return node;}int isEmpty(Queue *queue) {return queue->size == 0;}```我们可以使用队列来实现二叉树的层次遍历:```void levelOrder(TreeNode *root) {if (root == NULL) {return;}Queue *queue = createQueue(1000);enqueue(queue, root);while (!isEmpty(queue)) {TreeNode *node = dequeue(queue);printf("%d ", node->val);if (node->left != NULL) {enqueue(queue, node->left);}if (node->right != NULL) {enqueue(queue, node->right);}}}```在这个函数中,我们首先判断根节点是否为空,如果为空则直接返回。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
掌握二叉树的二叉链表存储结构;掌握二叉树的遍历规则;利用二叉树的二叉链表存储结构实现二叉树的建树操作;利用二叉树的二叉链表存储结构实现二叉树层次遍历操作
二叉树采用二叉链表结构表示。
设计并实现如下算法:输入某棵二叉树的广义表形式,建立该二叉树,并按层次遍历该二叉树----队列形式
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define STACK_MAX_SIZE 30
#define QUEUE_MAX_SIZE 30
typedef struct BitNode{
char data;
struct BitNode *lchild;
struct BitNode *rchild;
}BitNode,*BiTree;;
typedef struct node
{
BitNode *data;
}node,*queue;
typedef struct Queue
{ node *base;
int front;
int rear;
}Queue;
void InitQueue(Queue *Q)
{ Q->base=(queue)malloc(QUEUE_MAX_SIZE*sizeof(node));
Q->front=Q->rear=0;
}
int EmptyQueue(Queue *Q)
{ if(Q->front==Q->rear)
return 1;
else
return 0;
}
void EnQueue(Queue *Q,BitNode *e) { Q->base[Q->rear].data=e;
Q->rear++;
}
BiTree DeQueue(Queue *Q)
{
int m;
m=Q->front;
Q->front++;
return (Q->base[m].data);
}
char a[50];
BiTree CreatBiTree(BiTree T)
{
BiTree p;
BiTree s[STACK_MAX_SIZE];
int top = -1;
int flag;
int i = 0;
T=NULL;
while(a[i]!='#')
{
switch(a[i])
{case' ':break;
case '(':
top++;
s[top] = p;
flag = 1;
break;
case ')':
top--;
break;
case ',': flag = 0; break;
default: p = (BitNode *)malloc(sizeof(BitNode));
p->data = a[i];
p->lchild = p->rchild = NULL;
if(T==NULL)
{ T=p; }
else
{ if( flag == 1)
{ s[top]->lchild = p; }
else { s[top]->rchild = p; }
}
}
i++;
}
return T;
}
void LevelOrder(BiTree T)
{ Queue l;
Queue *Q=&l;
BiTree p;
InitQueue(Q);
if(T)
{EnQueue(Q,T);
while(!EmptyQueue(Q))
{ p=DeQueue(Q);
printf("%c",p->data);
if(p->lchild)
EnQueue(Q,p->lchild);
if(p->rchild)
EnQueue(Q,p->rchild);
}
}
}
void main()
{
BitNode *T;
printf("please input the Generalized list: \n");
gets(a);
T=CreatBiTree(T);
printf("the order is:\n");
LevelOrder(T);
getch();
}。