树,二叉树,广义表,CTreeCtrl使用范例

// TreeItor.cpp : 定义控制台应用程序的入口点。

//

#include"stdafx.h"

#include

#include

#include

#include

using namespace std;

typedef struct BinTree

{

char Name;

BinTree *pLeft;

BinTree *pRight;

//这个参数不是必须的,在模拟建立CTreeCtrl这样的结构时使用

//为检查模拟是否成功

BinTree *pParent;

BinTree(){Name = '\0'; pLeft = NULL; pRight = NULL;pParent = NULL;} }TT,*PTT;

PTT pRoot;

TT a,b,c,d,e,f,g;

/*

这样的一个结构

a

b c

d e f

g

*/

void CreateTree()

{

https://www.360docs.net/doc/b210554226.html, = 'a'; a.pLeft = &b; a.pRight = &c;

https://www.360docs.net/doc/b210554226.html, = 'b'; b.pLeft = &d; b.pRight = &e;

https://www.360docs.net/doc/b210554226.html, = 'c'; c.pLeft = &f; c.pRight = NULL;

https://www.360docs.net/doc/b210554226.html, = 'd'; d.pLeft = NULL; d.pRight = NULL;

https://www.360docs.net/doc/b210554226.html, = 'e'; e.pLeft = NULL; e.pRight = &g;

https://www.360docs.net/doc/b210554226.html, = 'f'; f.pLeft = NULL; f.pRight = NULL;

https://www.360docs.net/doc/b210554226.html, = 'g'; g.pLeft = NULL; g.pRight = NULL;

pRoot = &a;

}

void Pre_Itor(PTT pRt)

{

if(pRt != NULL)

{

printf(&(pRt->Name));

Pre_Itor(pRt->pLeft);

Pre_Itor(pRt->pRight);

}

}

/*

从‘广义表’创建二叉树,广义表每个节点至多有两个子节点,子节点有左右之分字符串形同:A{B{C,D{H,I}},E{,F{G}}}

表现为,无论如何嵌套,每对括号内至多有一个“,”

*/

PTT CreateBinTree(char *str)

{

if(str == NULL)

{

return NULL;

}

char *p = str;

stack pStack;

PTT pRoot = NULL;

while(*p != '\0')

{

if(*p != '}' && *p != '{' && *p != ',')

{

PTT pNew = new TT();

pNew->Name = *p;

if(*(p-1) == '{')

{

pStack.top()->pLeft = pNew;

}

if(*(p-1) == ',')

{

pStack.top()->pRight = pNew;

}

if(*(p+1) == '{')

{

pStack.push(pNew);

}

}

else if(*p == '}')

{

if(pStack.size() == 1)

{

pRoot = pStack.top();

}

pStack.pop();

}

p++;

}

return pRoot;

}

/*

从‘广义表’创建二叉树,广义表每个节点都可能有N个子节点,字符串形同:A{B{C,D{H,I}},E{,F{G}}}

表现为一对大括号内可能有多个‘,’,就是普通的树

转化成二叉树之后使用左子女,右兄弟表达

*/

PTT CreateTree(char *str)

{

if(str == NULL)

{

return NULL;

}

char *p = str;

stack pCS;

stack*> pBS; //储存兄弟栈指针的栈

PTT pRoot = NULL;

while(*p != '\0')

{

if(*p != '}' && *p != '{' && *p != ',')

{

PTT pNew = new TT();

pNew->Name = *p;

if(p == str)

{

pCS.push(pNew);

pRoot = pNew;

}

if(*(p-1) == '{')

{

pCS.top()->pLeft = pNew;

if(*(p+1) == ',')

{

stack *pst = new stack;

pst->push(pNew);

pBS.push(pst);

}

if(*(p+1) == '{')

{

pCS.push(pNew);

//...{S{...}...这种结构不能仅仅根据S左右来判断是否有建立兄弟栈

//所以以下代码是检测是否有兄弟,如果有,建立兄弟栈

char *pc = p+1;

int layer = 0;

bool hasB = false;

while(*pc != '\0')

{

if(*pc == '{')

{

layer++;

}

if(*pc == '}')

{

layer--;

}

if(*pc == ',' && layer == 0)

{

hasB = true;

break;

}

pc++;

}

//检测完毕

if(hasB == true)

{

stack *pst = new stack;

pst->push(pNew);

pBS.push(pst);

}

}

if(*(p+1) == '}')

{

pCS.pop();

}

}

if(*(p-1) == ',')

{

pBS.top()->top()->pRight = pNew;

if(*(p+1) == ',')

{

pBS.top()->push(pNew);

}

if(*(p+1) == '{')

{

pCS.push(pNew);

stack *pst = new stack;

pst->push(pNew);

pBS.push(pst);

}

if(*(p+1) == '}')

{

pCS.pop();

delete pBS.top();

pBS.pop();

}

}

}

p++;

}

return pRoot;

}

//把一个二叉树写入到一个‘二叉树的广义表’里面

void ListBinTree(PTT pRt)

{

if(pRt != NULL)

{

printf("%c",pRt->Name);

if (pRt->pLeft != NULL || pRt->pRight != NULL)

{

printf("{");

ListBinTree(pRt->pLeft);

if (pRt->pRight != NULL)

{

printf(",");

}

ListBinTree(pRt->pRight);

printf("}");

}

}

}

//把一个二叉树写入到一个‘树的广义表’里面

//第二个参数始终记录根节点

void ListTree(PTT pRt,const PTT pCR)

{

if(pRt != NULL)

{

printf("%c",pRt->Name);

//如果有左子树,其后一定跟着‘{’

if(pRt->pLeft != NULL)

{

printf("{");

ListTree(pRt->pLeft,pCR);

}

//如果右子树不为空,其后一定跟着‘,’

if(pRt->pRight != NULL)

{

printf(",");

ListTree(pRt->pRight,pCR);

}

else//如果右子树为空,右子树后一定跟着‘}’,根节点除外

{

if(pRt != pCR)

{

printf("}");

}

}

}

}

//也就使用“凹凸树”来表示一个用二叉树储存的树的结构

#define INDENT " "

void FormListTree(PTT pRt,int &nLay)

{

if(pRt != NULL)

{

printf("\n");

for(int i = 0;i < nLay;i++)

{

printf(INDENT);

}

printf("%c",pRt->Name);

if(pRt->pLeft != NULL)

{

FormListTree(pRt->pLeft,++nLay);

}

if(pRt->pRight != NULL)

{

FormListTree(pRt->pRight,nLay);

}

else

{

--nLay;

}

}

}

//把一颗二叉树模拟做成CTreeCtrl的函数

//第二个参数是父节点

void SimCTree(PTT pRt,PTT pP)

{

if(pRt != NULL)

{

pRt->pParent = pP;

if(pRt->pLeft != NULL)

{

SimCTree(pRt->pLeft,/*注意区别*/pRt);

}

if(pRt->pRight != NULL)

{

SimCTree(pRt->pRight,/*注意区别*/pP);

}

}

}

void Mid_Itor(PTT pRt)

{

if(pRt != NULL)

{

Mid_Itor(pRt->pLeft);

printf(&(pRt->Name));

Mid_Itor(pRt->pRight);

}

}

void Aft_Itor(PTT pRt)

{

if(pRt != NULL)

{

Aft_Itor(pRt->pLeft);

Aft_Itor(pRt->pRight);

printf(&(pRt->Name));

}

}

/*

使用队列按层次遍历二叉树

*/

void Layer_Itor(PTT pRt)

{

deque q;

q.push_front(pRt);

while(!q.empty())

{

pRt = q.at(q.size()-1);

q.pop_back();

printf(&(pRt->Name));

if(pRt->pLeft != NULL)

{

q.push_front(pRt->pLeft);

}

if(pRt->pRight != NULL)

{

q.push_front(pRt->pRight);

}

}

}

//计算节点数,使用了度为的节点数是叶子节点数+1

//其实敝人认为任何一种遍历不都能求出么,只不过要个全局变量int Nodes(PTT pRt)

{

if(pRt == NULL)

{

return 0;

}

if(pRt->pLeft == NULL && pRt->pRight == NULL)

{

return 1;

}

else

{

return Nodes(pRt->pLeft) + Nodes(pRt->pRight) + 1;

}

}

int _tmain(int argc, _TCHAR* argv[])

{

CreateTree();

Pre_Itor(pRoot);

printf("\n");

Mid_Itor(pRoot);

printf("\n");

Aft_Itor(pRoot);

printf("\n");

Layer_Itor(pRoot);

printf("\n");

ListBinTree(pRoot);

printf("\n");

PTT pt1 = CreateBinTree("A{B{C,D},E{,F{G}}}");

PTT pt2 = CreateTree("A{B,C{D,E},F{G},H{I,J{K}}}");

ListTree(pt2,pt2);

SimCTree(pt2,NULL);

int l = 0; //所在层次

FormListTree(pt2,l);

printf("\n");

int c = Nodes(pt1);

return 0;

}

表达式二叉树·实验代码

实验:表达式二叉树 实验要求: 建立表达式二叉树,并打印(可逆时针旋转90度打印,也可尝试正向打印) 以中缀表达式a*b+(c-d)/e-f 为例,建立以"-"号为根的表达式二叉树。 提示:若直接利用中缀表达式建立困难,可先将中缀表达式转化为后缀表达式(可利用栈中的中缀到后缀转化程序实现中缀表达式到后缀表达式的转换,再根据后缀表达式建立表达式二叉树,可参考栈中后缀表达式计算方法)。 实验代码: #include #include #include #include #include using namespace std; class tnode; void buildexptree(const string &exp); void printexptree(); int judgerank(char ch); bool isoperator(char ch); void test(); void setxy(tnode *tn, int y); int X = 0; int Y = 0; int depth = 0; vectorvt; class tnode{ public: char nodeV alue; int x, y; tnode *left; tnode *right;

tnode(){ x = 0; y = 0; } tnode(char &item, tnode *lptr = NULL, tnode *rptr = NULL): nodeV alue(item), left(lptr), right(rptr){ x = 0; y = 0; } }; tnode *myNode; bool cmp(tnode *t1, tnode *t2){ if(t1->y != t2->y) return (t1->y) > (t2->y); return (t1->x) < (t2->x); } class zpair{ //将operator和rank打包为一体,临时存储在stk2中public: char op; int rank; zpair(){} zpair(char _op, int _rank){ op = _op; rank = _rank; } }; int judgerank(char ch){ if(ch == '(') return -1; if(ch == '+' || ch == '-') return 1; if(ch == '*' || ch == '/') return 2; return 0; } bool isoperator(char ch){ if(ch == '(' || ch == ')' || ch == '+' || ch == '-' || ch == '*' || ch == '/') return true; else return false; }

数据结构:二叉树子系统

/* *题目:按屏幕提示用前序方法建立一棵二叉树,并能按凹入法显示二叉树结构。 * 编写前序遍历、中序遍历、后序遍历、层次遍历程序。 * 编写求二叉树的叶结点数、总结点数和深度的程序。 * 设计一个选择式菜单,以菜单方式选择下列操作。 * 二叉树子系统 * *************************** **** * * 1 -- 建二叉树* * * 2 -- 凹入显示* * * 3 -- 先序遍历* * * 4 -- 中序遍历* * * 5 -- 后序遍历* * * 6 -- 层次遍历* * *7 -- 求叶子数* * *8 -- 求结点数* * *9 -- 求树深度* * *0 -- 返回* * *************************** **** * 请选择菜单号(0--9) */ #include #include typedef struct bTree // 二叉树结点{ char data; // 值域 struct bTree *lchild; // 左孩子 struct bTree *rchild; // 右孩子 }BT; BT *createTree(); void showTree(BT *t); void preOrder(BT *t); void postOrder(BT *t); void inOrder(BT *t); void levelOrder(BT *t); int leafNum(BT *t); int nodeNum(BT *t); int treeDepth(BT *t); /************************************************* Function: main() Description: 主调函数 Calls: createTree() showTree() preOrder() postOrder() in Order() leafNum() levelOrder() no deNum() treeDepth() In put: NULL

树和二叉树习题集与答案解析

一、填空题 1. 不相交的树的聚集称之为森林。 2. 从概念上讲,树与二叉树是两种不同的数据结构,将树转化为二叉树的基本目的是_树可采用孩子-兄弟链表(二叉链表)做存储结构,目的是利用二叉树的已有算法解决树的有关问题。 3. 深度为k的完全二叉树至少有2 k-1个结点。至多有2 k-1个结点,若按自上而下,从左到右次序给结点编号(从1开始),则编号最小的叶子结点的编号是2 k-2+1。 4. 在一棵二叉树中,度为零的结点的个数为n 0,度为2的结点的个数为n 2,则有n0= n2+1。 5. 一棵二叉树的第i(i≥1)层最多有2 i-1个结点;一棵有n(n>0)个结点的满二叉树共有(n+1)/2个叶子和(n-1)/2个非终端结点。 6.现有按中序遍历二叉树的结果为abc,问有5种不同形态的二叉树 可以得到这一遍历结果。 7. 哈夫曼树是带权路径最小的二叉树。 8. 前缀编码是指任一个字符的编码都不是另一个字符编码的前缀的一种编码方法,是设计不等长编码的前提。 9. 以给定的数据集合{4,5,6,7,10,12,18}为结点权值构造的Huffman树的加权路径长度是165 。 10. 树被定义为连通而不具有回路的(无向)图。 11. 若一棵根树的每个结点最多只有两个孩子,且孩子又有左、右之分,次序不能颠倒,则称此根树为二叉树。

12. 高度为k,且有个结点的二叉树称为二叉树。 2k-1 满 13. 带权路径长度最小的二叉树称为最优二叉树,它又被称为树。 Huffman 14. 在一棵根树中,树根是为零的结点,而为零的结点是 结点。 入度出度树叶 15. Huffman树中,结点的带权路径长度是指由到之间的路径长度与结点权值的乘积。 结点树根 16. 满二叉树是指高度为k,且有个结点的二叉树。二叉树的每一层i上,最多有个结点。 2k-1 2i-1 二、单选题 1. 具有10个叶结点的二叉树中有(B) 个度为2的结点。 (A)8 (B)9 (C)10 (D)11 2.对二叉树的结点从1开始进行连续编号,要求每个结点的编号大于其左右孩子的编号,同一结点的左右孩子中,其左孩子的编号小于其右孩子的编号,则可采用_(3)次序的遍历实现编号。 (1)先序(2)中序 (3)后序(4)从根开始按层遍历 3. 由2、3、4、7作为结点权值构造的树的加权路径长度 B 。

树和二叉树习题数据结构

习题六树和二叉树一、单项选择题 1.以下说法错误的是 ( ) A.树形结构的特点是一个结点可以有多个直接前趋B.线性结构中的一个结点至多只有一个直接后继 C.树形结构可以表达(组织)更复杂的数据 D.树(及一切树形结构)是一种"分支层次"结构 E.任何只含一个结点的集合是一棵树 2.下列说法中正确的是 ( ) A.任何一棵二叉树中至少有一个结点的度为2 B.任何一棵二叉树中每个结点的度都为2 C.任何一棵二叉树中的度肯定等于2 D.任何一棵二叉树中的度可以小于2 3.讨论树、森林和二叉树的关系,目的是为了()A.借助二叉树上的运算方法去实现对树的一些运算B.将树、森林按二叉树的存储方式进行存储

C.将树、森林转换成二叉树 D.体现一种技巧,没有什么实际意义 4.树最适合用来表示 ( ) A.有序数据元素 B.无序数据元素 C.元素之间具有分支层次关系的数据 D.元素之间无联系的数据5.若一棵二叉树具有10个度为2的结点,5个度为1的结点,则度为0的结点个数是()A.9 B.11 C.15 D.不确定 6.设森林F中有三棵树,第一,第二,第三棵树的结点个数分别为M1,M2和M3。与森林F对应的二叉树根结点的右子树上的结点个数是()。 A.M1 B.M1+M2 C.M3 D.M2+M3 7.一棵完全二叉树上有1001个结点,其中叶子结点的个数是() A. 250 B. 500 C.254 D.505 E.以上答案都不对 8. 设给定权值总数有n 个,其哈夫曼树的结点总数为( ) A.不确定 B.2n C.2n+1 D.2n-1 9.二叉树的第I层上最多含有结点数为() A.2I B. 2I-1-1 C. 2I-1 D.2I -1

第6章树和二叉树习题

第六章 树和二叉树 一、选择题 1.算术表达式a+b*(c+d/e )转为后缀表达式后为( B ) A .ab+cde/* B .abcde/+*+ C .abcde/*++ D .2. 设有一表示算术表达式的二叉树(见下图), 它所表示的算术表达式是( C ) A. A*B+C/(D*E)+(F-G) B. (A*B+C)/(D*E)+(F-G) C. (A*B+C)/(D*E+(F-G )) D. A*B+C/D*E+F-G 3. 设树T 的度为4,其中度为1,2,3和4的结点个数分别为4,2,1 ,1 则T 中的叶子数为( D ) A .5 B .6 C .7 D .8 4. 在下述结论中,正确的是( D ) ①只有一个结点的二叉树的度为0; ②二叉树的度为2; ③二叉树的左右子树可任意 交换; ④深度为K 的完全二叉树的结点个数小于或等于深度相同的满二叉树。 A .①②③ B .②③④ C .②④ D .①④ 5. 设森林F 对应的二叉树为B ,它有m 个结点,B 的根为p,p 的右子树结点个数为n,森林F 中第一棵树的结点个数是( A ) A .m-n B .m-n-1 C .n+1 D .条件不足,无法确定 6.若一棵二叉树具有10个度为2的结点,5个度为1的结点,则度为0的结点个数是( B ) A .9 B .11 C .15 D .不确定 7.设森林F 中有三棵树,第一,第二,第三棵树的结点个数分别为M1,M2和M3。与森林F 对应的二叉树根结点的右子树上的结点个数是( D )。 A .M1 B .M1+M2 C .M3 D .M2+M3 8.一棵完全二叉树上有1001个结点,其中叶子结点的个数是( E ) A . 250 B . 500 C .254 D .505 E .以上答案都不对 9. 有关二叉树下列说法正确的是( B ) A .二叉树的度为2 B .一棵二叉树的度可以小于2 C .二叉树中至少有一个结点的度为2 D .二叉树中任何一个结点的度都为2 10.二叉树的第I 层上最多含有结点数为( C ) A .2I B . 2I-1-1 C . 2I-1 D .2I -1 11. 一个具有1025个结点的二叉树的高h 为( C ) A .11 B .10 C .11至1025之间 D .10至1024之间 12.一棵二叉树高度为h,所有结点的度或为0,或为2,则这棵二叉树最少有( B )结点 A .2h B .2h-1 C .2h+1 D .h+1 13. 一棵树高为K 的完全二叉树至少有( C )个结点 A .2k –1 B. 2k-1 –1 C. 2k-1 D. 2 k 14.对二叉树的结点从1开始进行连续编号,要求每个结点的编号大于其左、右孩子的编号,同一结点的左右孩子中,其左孩子的编号小于其右孩子的编号,可采用( C )次序的遍历 实现编号。 A .先序 B. 中序 C. 后序 D. 从根开始按层次遍历 15.一棵二叉树的前序遍历序列为ABCDEFG ,它的中序遍历序列可能是( B )

基于matlab构造最优二叉树

摘要 Matlab是一种用于算法开发,数据可视化,数据分析以及数值计算的高级技术计算语言和交互式环境。MATLAB是当今最优秀的科技应用软件之一,利用MATLAB 对层次分析法的判断、分析和计算过程进行处理后,为决策者提供方便友好的对话界面。只要决策者在MATLAB软件中输入自己的层次结构方案和两两对比的判断矩阵后能迅速得出相应的结果,为解决实际问题提供一个快捷的方法。从而提高人们的决策效率,同时也为科技工作者使用层次分析法提供一种新思路。本文是利用matlab的强大功能来构造最优二叉树。二叉树是一种非常重要以及常见的数据结构,不仅在计算机系统中运用广泛,而且在日常生活中也有一定的应用。本文概述了二叉树的数据结构以及使用matlab来模拟出二叉树的数据结构,从而来实现二叉树的插入,删除,查询等常用功能。 关键词:Matlab;二叉树;数据结构;

ABSTRACT Matlab is used for algorithm development, data visualization, data analysis and numerical calculation of the senior technical computing language and interactive environment. Matlab is the most outstanding application of science and technology, using MATLAB to determine the right level of analysis, analysis and computation processing, in order to provide decision makers with convenient user-friendly dialog interface. When the decision-makers in MATLAB software, enter their own hierarchy of the program and judgment matrix to determine quickly after the corresponding results obtained, in order to solve practical problems to provide a quick method. Thereby enhancing the efficiency of people's decision-making, but also for the scientific and technological workers to use AHP to provide a new idea.This article is using matlab to construct optimal binary tree. Binary Tree is a very important and common data structures, it is widely used in the computer system. This article outlines the binary tree data structure and the use of matlab to simulate a binary tree data structure, in order to achieve the binary tree insertion, deletion, query and other commonly used functions. Key words:Matlab;binary tree;data struction;

树转换成二叉树-树的前序、后序的递归、非递归和层次序的非递归

#include <> #include <> #include <> #define MAX_TREE_SIZE 100 typedef struct { int data; int parent; ata,[i].parent); printf("\n"); } } /*用双亲表示法创建树*/ PTree CreatTree(PTree T) { int i=1; int fa,ch; PTNode p; for(i=1;ch!=-1;i++) { printf("输入第%d结点:\n",i); scanf("%d,%d",&fa,&ch); printf("\n"); =ch; =fa; ++; [].data = ; [].parent = ; } printf("\n"); printf("创建的树具体情况如下:\n"); print_ptree(T); return T; } /*一般树转换成二叉树*/ BTNode *change(PTree T) { int i,j=0; BTNode p[MAX_TREE_SIZE]; BTNode *ip,*is,*ir,*Tree; ip=(BTNode *)malloc(sizeof(BTNode)); is=(BTNode *)malloc(sizeof(BTNode));

ir=(BTNode *)malloc(sizeof(BTNode)); Tree=(BTNode *)malloc(sizeof(BTNode)); for(i=0;i<;i++) { p[i]=GetTreeNode[i].data); } for(i=1;i<;i++) { ip=&p[i]; is=&p[j]; while[i].parent!=is->data) { j++; is=&p[j]; } if(!(is->firstchild)) { is->firstchild=ip; ir=ip; } else { ir->rightsib=ip; ir=ip; } } Tree=&p[0]; return Tree; } /*主菜单*/ void Menu() { printf("=================主菜单=======================\n"); printf("***输入-以双亲法创建一棵一般树***\n"); printf("***输入2-------------树的前序遍历(递归)*******\n"); printf("***输入3-------------树的后序遍历(递归)*******\n"); printf("***输入4-------------树的前序遍历(非递归)*****\n"); printf("***输入5-------------树的后序遍历(非递归)*****\n"); printf("***输入6-------------层次序的非递归遍历*******\n"); printf("***输入0-------------退出程序*****************\n"); printf("==============================================\n");

数据结构树和二叉树习题

树与二叉树 一.选择题 1.假定在一棵二叉树中,双分支结点数为15,单分支结点数为30个,则叶子结 点数为()个。 A.15B.16C.17D.47 2.按照二叉树的定义,具有3个结点的不同形状的二叉树有()种。 A. 3 B. 4 C. 5 D. 6 3.按照二叉树的定义,具有3个不同数据结点的不同的二叉树有()种。 A. 5 B. 6 C. 30 D. 32 4.深度为5的二叉树至多有()个结点。1 A. 16 B. 32 C. 31 D. 10 5.设高度为h的二叉树上只有度为0和度为2的结点,则此类二叉树中所包含的 结点数至少为()。 A. 2h B. 2h-1 C. 2h+1 D. h+1 6.对一个满二叉树2,m个树叶,n个结点,深度为h,则()。 A. n=h+m3 B. h+m=2n C. m=h-1 D. n=2 h-1 1深度为n的二叉树结点至多有2n-1 2满二叉树是除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二叉树7.任何一棵二叉树的叶结点在先序.中序和后序遍历序列中的相对次序()。 A.不发生改变 B.发生改变 C.不能确定 D.以上都不对 8.如果某二叉树的前根次序遍历结果为stuwv,中序遍历为uwtvs,那么该二叉 树的后序为()。 A. uwvts B. vwuts C. wuvts D. wutsv 9.某二叉树的前序遍历结点访问顺序是abdgcefh,中序遍历的结点访问顺序是 dgbaechf,则其后序遍历的结点访问顺序是()。 A. bdgcefha B. gdbecfha C. bdgaechf D. gdbehfca 10.在一非空二叉树的中序遍历序列中,根结点的右边()。 A. 只有右子树上的所有结点 B. 只有右子树上的部分结点 C. 只有左子树上的部分结点 D. 只有左子树上的所有结点 11.树的基本遍历策略可分为先根遍历和后根遍历;二叉树的基本遍历策略可分为 先序遍历.中序遍历和后序遍历。这里,我们把由树转化得到的二叉树4叫做这棵数对应的二叉树。结论()是正确的。 A.树的先根遍历序列与其对应的二叉树的先序遍历序列相同 B.树的后根遍历序列与其对应的二叉树的后序遍历序列相同 3对于深度为h的满二叉树,n=20+21+…+2h-1=2h-1,m=2h-1。故而n=h+m。 4树转化为二叉树的基本方法是把所有兄弟结点都用线连起来,然后去掉双亲到子女的连线,只留下双亲到第一个子女的连线。因此原来的兄弟关系就变为双亲与右孩子的关系。 1/ 9

算术表达式与二叉树

目录 一、系统开发的背景 (1) 二、系统分析与设计 (1) (一)系统功能要求 (1) (二)系统模块结构设计 (1) 三、系统的设计与实现 (3) (一)二叉树的遍历 (3) (二)算术表达式求值 (5) 四、系统测试 (9) (一)测试二叉树遍历函数 (9) (二)测试算术表达式求值函数 (10) 五、总结 (10) 六、附件(代码、部分图表) (10) (一)程序代码 (10) (二)实验截图 (15)

算术表达式与二叉树 一、系统开发的背景 为了方便进行基本的算术运算,减轻对数字较大的数操作时所带来的麻烦,及其在运算过程中错误的避免。因此设计算术表达式与二叉树的程序来解决此问题。 二、系统分析与设计 (一)系统功能要求 由于一个表达式和一棵二叉树之间,存在着自然的对应关系。遍写一个程序,实现基于二叉树表示的算术表达式的操作。算术表达式内可以含有变量(a~z)、常量(0~9)和二元运算符(+,-,*,/,^(乘幂))。 具体实现以下操作: 1以字符序列的形式输入语法正确的前缀表达式并构造表达式。 2用带括弧的中缀表达式输出表达式。 3实现对变量V的赋值(V=c),变量的初值为0。 4对算术表达式E求值。 (二)系统模块结构设计 通过对系统功能的分析,基于二叉树表示的算术表达式的功能 如图(1)所示。

图1:基于二叉树表示的算术表达式的功能图 通过上图的功能分析,把整个系统划分为主要的两大个模块: 1、将语法正确的前缀表达式用二叉树的遍历转换成相应的遍历序列,必要时可以求出此二叉树的结点数及其树的深度。该模块借助函数BiTree Create(BiTree T)创建二叉树,void Preorder(BiTree T) 先序遍历, void InOrder(BiTree T)中序遍历,void PostOrder(BiTree T)后序遍历,int Sumleaf(BiTree T)统计叶结点的数目,int Depth(BiTree T)二叉树的深度6个函数联合来实现; 2、计算中序遍历所得的算术表达式的值。其中先要将扫描得到的中缀表达式转换为后缀表达式,然后利用栈的初始化,进栈与取栈顶元素操作进行对后缀表达式进行计算。该模块借助函数void InitStack(SeqStack *S)初始化栈,int PushStack(SeqStack *S,char e)进栈,int GetTop(SeqStack

数据结构课程设计树与二叉树的转换

《数据结构》课程设计报告 设计题目:_树与二叉树的转换___ 姓名:_______李锦_____________ 学号:________211214011_______ 专业:_______物联网工程_______ 院系:_______计算机科学与技术_______ 班级:__________1205___________

指导教师:_________高秀梅______ 2014年 2 月14 日

目录 一、问题描述 (2) 二、基本要求 (2) 三、概要设计 (2) 四、数据结构设计 (2) 五、算法设计 (3) 1、算法分析 (3) 2、算法实现 (3) 六、程序测试与实现 (6) 1、函数之间的调用关系 (6) 2、主程序 (6) 3、测试数据 (8) 4、测试结果 (8) 七、调试分析 (10) 八、遇到的问题及解决办法 (10) 九、心得体会 (10)

一、问题描述 完成树与二叉树的转换 二、基本要求 1、树采用双亲表示法 2、能够将树转换为二叉树 3、对转换的二叉树进行算法设计统计人一结点的孩子数 4、利用转换的二叉树计算树的高度 三、概要设计 操作集合: (1) CTreeNode *SearchCTree(CTreeNode *root ,char data) 查找树结点 (2) CTreeNode *CreateSTree() 生成树 (3) void preorderTree(CTreeNode *ctroot) 树的遍历 (4) void PrintTree(CTreeNode *troot,int depth) 树的输出 (5 void initQueueCTree(QueueCTree *&q) 初始化树队列 (6) void initQueueBTree(QueueBTree *&q) 初始化二叉树队列 (7)void TreeToBTree(CTreeNode *ctroot,BTreeNode *&btroot) //树转化为二叉树ctroot指向树的根节点,btroot,指向二叉树的根 四、数据结构设计 struct CTreeNode//树节点的类型 { char data;//数据域,采用char星 struct CTreeNode *children[DEGREE];//指向孩子节点的指针域 }; struct BTreeNode { char data;//数据域

数据结构第六章树和二叉树习题及答案

习题六树和二叉树 一、单项选择题 1.以下说法错误的是() A. 树形结构的特点是一个结点可以有多个直接前趋 B. 线性结构中的一个结点至多只有一个直接后继 C. 树形结构可以表达(组织)更复杂的数据 D. 树(及一切树形结构)是一种”分支层次”结构 E. 任何只含一个结点的集合是一棵树 2. 下列说法中正确的是() A. 任何一棵二叉树中至少有一个结点的度为2 B. 任何一棵二叉树中每个结点的度都为2 C. 任何一棵二叉树中的度肯定等于2 D. 任何一棵二叉树中的度可以小于2 3. 讨论树、森林和二叉树的关系,目的是为了() A. 借助二叉树上的运算方法去实现对树的一些运算 B. 将树、森林按二叉树的存储方式进行存储 C. 将树、森林转换成二叉树 D. 体现一种技巧,没有什么实际意义4.树最适合用来表示() A. 有序数据元素 B .无序数据元素 C.元素之间具有分支层次关系的数据 D .元素之间无联系的数据 5.若一棵二叉树具有10个度为2的结点,5个度为1的结点,则度为0的结点个数是()A.9 B .11 C .15 D .不确定 6. 设森林F中有三棵树,第一,第二,第三棵树的结点个数分别为M1, M2和M3与森林F 对应的二叉树根结点的右子树上的结点个数是()。 A.M1 B .M1+M2 C .M3 D .M2+M3 7.一棵完全二叉树上有1001个结点,其中叶子结点的个数是() A.250 B .500 C .254 D .505 E .以上答案都不对 8. 设给定权值总数有n 个,其哈夫曼树的结点总数为() A. 不确定 B . 2n C . 2n+1 D . 2n-1 9.二叉树的第I 层上最多含有结点数为() I I-1 I-1 I A.2I B .2 I-1 -1 C .2 I-1 D .2 I -1 10.一棵二叉树高度为h, 所有结点的度或为0,或为2,则这棵二叉树最少有()结点A.2h B .2h-1 C .2h+1 D .h+1 11. 利用二叉链表存储树,则根结点的右指针是()。 A.指向最左孩子 B .指向最右孩子 C .空D .非空 12.已知一棵二叉树的前序遍历结果为为()。 A.CBEFDA B .FEDCBA 13.已知某二叉树的后序遍历序列是()。 ABCDEF中序遍历结果 为 C .CBEDFA D dabec, 中序遍历序列是 CBAEDF则后序遍历的结 果 .不定 debac , 它的前序遍历是

数据结构实验二叉树

实验六:二叉树及其应用 一、实验目的 树是数据结构中应用极为广泛的非线性结构,本单元的实验达到熟悉二叉树的存储结构的特性,以及如何应用树结构解决具体问题。 二、问题描述 首先,掌握二叉树的各种存储结构和熟悉对二叉树的基本操作。其次,以二叉树表示算术表达式的基础上,设计一个十进制的四则运算的计算器。 如算术表达式:a+b*(c-d)-e/f 三、实验要求 如果利用完全二叉树的性质和二叉链表结构建立一棵二叉树,分别计算统计叶子结点的个数。求二叉树的深度。十进制的四则运算的计算器可以接收用户来自键盘的输入。由输入的表达式字符串动态生成算术表达式所对应的二叉树。自动完成求值运算和输出结果。四、实验环境 PC微机 DOS操作系统或 Windows 操作系统 Turbo C 程序集成环境或 Visual C++ 程序集成环境 五、实验步骤 1、根据二叉树的各种存储结构建立二叉树; 2、设计求叶子结点个数算法和树的深度算法; 3、根据表达式建立相应的二叉树,生成表达式树的模块; 4、根据表达式树,求出表达式值,生成求值模块; 5、程序运行效果,测试数据分析算法。 六、测试数据 1、输入数据:*(+)3 正确结果: 2、输入数据:(1+2)*3+(5+6*7);

正确输出:56 七、表达式求值 由于表达式求值算法较为复杂,所以单独列出来加以分析: 1、主要思路:由于操作数是任意的实数,所以必须将原始的中缀表达式中的操作数、操作符以及括号分解出来,并以字符串的形式保存;然后再将其转换为后缀表达式的顺序,后缀表达式可以很容易地利用堆栈计算出表达式的值。 例如有如下的中缀表达式: a+b-c 转换成后缀表达式为: ab+c- 然后分别按从左到右放入栈中,如果碰到操作符就从栈中弹出两个操作数进行运算,最后再将运算结果放入栈中,依次进行直到表达式结束。如上述的后缀表达式先将a 和b 放入栈中,然后碰到操作符“+”,则从栈中弹出a 和b 进行a+b 的运算,并将其结果d(假设为d)放入栈中,然后再将c 放入栈中,最后是操作符“-”,所以再弹出d和c 进行d-c 运算,并将其结果再次放入栈中,此时表达式结束,则栈中的元素值就是该表达式最后的运算结果。当然将原始的中缀表达式转换为后缀表达式比较关键,要同时考虑操作符的优先级以及对有括号的情况下的处理,相关内容会在算法具体实现中详细讨论。 2、求值过程 一、将原始的中缀表达式中的操作数、操作符以及括号按顺序分解出来,并以字符串的 形式保存。 二、将分解的中缀表达式转换为后缀表达式的形式,即调整各项字符串的顺序,并将括 号处理掉。 三、计算后缀表达式的值。 3、中缀表达式分解 DivideExpressionToItem()函数。分解出原始中缀表达式中的操作数、操作符以及括号,保存在队列中,以本实验中的数据为例,分解完成后队列中的保存顺序如下图所示:

习题6树和二叉树.docx

习题6树和二叉树 说明: 本文档中,凡红色字标出的题请提交纸质作业,只写题号和答案即可。 6.1单项选择题 1. 由于二叉树屮每个结点的度最大为2,所以二叉树是一种特殊的树,这种说法_B_。 A. 正确 B.错误 2. 假定在一棵二叉树屮,双分支结点数为15,单分支结点数为30个,则叶子结点数为 B_个。 A. 15 B. 16 C. 17 D. 47 3. 按照二叉树的定义,具有3个结点的不同形状的二叉树有_C_种。 A. 3 B.4 C. 5 D. 6 4. 按照二叉树的定义,具有3个不同数据结点的不同的二叉树有_C_种。 A.5 B.6 C. 30 D. 32 5. 深度为5的二叉树至多有_C_个结点。 A. 16 B. 32 C. 31 D. 10 6. 设高度为h 的二叉树上只有度为0和度为2的结点,则此类二叉树中所包含的结点 数至少为 B 。 A. 2h B. 2h-l C. 2h+l D. h+l 7. 对一个满二叉树,m 个树叶,n 个结点,深度为h,则_A_。 A. n=h+m B. h+m=2n C. m=h-1 D. n=2 h -l 8. 任何一棵二叉树的叶结点在先序、中序和后序遍历序列中的相对次序_A_。 A.不发生改变 B.发生改变 C.不能确定 D.以上都不对 9. 如杲某二叉树的前根次序遍历结果为stuwv,中序遍历为uwtvs,那么该二叉树的后 序为_C_。 A. uwvts B. vwuts C. wuvts D. wutsv 10. 二叉树的前序遍历序列中,任意一个结点均处在其子女结点的前面,这种说法_A_。 A.正确 B.错误 11. 某二叉树的前序遍历结点访问顺序是abdgcefh,中序遍历的结点访问顺序是 dgbaechf,则其后序遍历的结点访问顺序是_D_。 A. bdgcefha B. gdbecfha 12. 在一非空二叉树的中序遍历序列中, A.只有右子树上的所有结点 13. 如图6.1所示二叉树的中序遍历序列是_B_。 14. 一棵二叉树如图6.2所示,其中序遍历的序列为 B 。 A. abdgcefh B. dgbaechf C. gdbehfca D. abcdefgh C. bdgaechf D. gdbehfca 根结点的右边_A_。 B.只有右子树上的部分结点 C.只有左子树上的部分结点 D.只有左子树上的所有结点 A. abcdgef B. dfebagc C. dbaefcg D. defbagc 图6」

树与二叉树习题解析(答)

习题五树与二叉树 一、选择题 1、一棵非空的二叉树的先序遍历序列与后序遍历序列正好相反,则该二叉树一定满足。 A、所有的结点均无左孩子 B、所有的结点均无右孩子 C、只有一个叶子结点 D、是任意一棵二叉树 2、一棵完全二叉树上有1001个结点,其中叶子结点的个数是。 A、250 B、500 C、254 D、505 E、以上答案都不对 3、以下说法正确的是。 A、若一个树叶是某二叉树前序遍历序列中的最后一个结点,则它必是该子树后序遍历序列中的最后一个结点 B、若一个树叶是某二叉树前序遍历序列中的最后一个结点,则它必是该子树中序遍历序列中的最后一个结点 C、在二叉树中,具有两个子女的父结点,在中序遍历序列中,它的后继结点最多只能有一个子女结点 D、在二叉树中,具有一个子女的父结点,在中序遍历序列中,它没有后继子女结点 4、以下说法错误的是。 A、哈夫曼树是带权路径长度最短得数,路径上权值较大的结点离根较近 B、若一个二叉树的树叶是某子树中序遍历序列中的第一个结点,则它必是该子树后序 遍历序列中的第一个结点 C、已知二叉树的前序遍历和后序遍历并不能唯一地确定这棵树,因为不知道树的根结 点是哪一个 D、在前序遍历二叉树的序列中,任何结点其子树的所有结点都是直接跟在该结点之后 的 5、一棵有124个叶结点的完全二叉树,最多有个结点。

A、247 B、248 C、249 D、250 E、251 6、任何一棵二叉树的叶结点在前(先)序、中序和后序遍历序列中的相对次序。 A、不发生变化 B、发生变化 C、不能确定 7、设a、b为一棵二叉树上的两个结点。在中序遍历时,a在b前面的条件是。 A、a在b的右方 B、a在b的左方 C、a是b的祖先 D、a是b的子孙 8、设深度为k的二叉树上只有度为0和度为2的结点,则这类二叉树上所含的结点总数为。 A、不确定 B、2k C、2k-1 D、2k+1 9、设有13个值,用它们组成一棵哈夫曼树,则该哈夫曼树共有个结点。 A、13 B、12 C、26 D、25 10、下面几个符号串编码集合中,不是前缀编码的是。 A、{0,10,110,1111} B、{11,10,001,101,0001} C、{00,010,0110,1000} D、{b,c,aa,ac,aba,abb,abc} 11、欲实现任意二叉树的后序遍历的非递归算法而不使用栈结构,最佳的方案是二叉树采用存储结构。 A、三叉链表 B、广义表 C、二叉链表 D、顺序表 12、以下说法错误的是。 A、存在这样的二叉树,对它采用任何次序遍历其结点访问序列均相同 B、二叉树是树的特殊情形 C、由树转换成二叉树,其根结点的右子树总是空的 D、在二叉树只有一棵子树的情况下也要明确指出该子树是左子树还是右子树 13、树的基本遍历策略可分为先根遍历和后根遍历,二叉树的基本遍历策略可分为先序、中序和后序三种遍历。我们把由树转化得到的二叉树称该树对应的二叉树,则下面是正确的。 A、树的先根遍历序列与其对应的二叉树先序遍历序列相同

表达式用二叉树表示(1)

数据结构程序报告(3) 2011.3.29

2. 需求分析: (1)功能:表达式可以用二叉树表示,对于简单的四则运算,请实现以下功能【1】对于任意给出的前缀表达式(不带括号)、中缀表达式(可以带括号)或后缀表达式(不带括号),能够在计算机内部构造出一棵表达式二叉树,并且图示出来(图形的形式)。 【2】对于构造好的内部表达式二叉树,按照用户的要求输出相应的前缀表达式(不带括号)、中缀表达式(可以带括号,但不允许冗余括)或后缀表达式(不带括号)。 提示:所谓中缀表达式中的冗余括号,就是去掉括号后不影响表达式的计算顺序。例如:“(c+b)+a”中的括号是冗余的,可以表示成不冗余的“c+b+a”。 (2)输入输出要求:请输入字符串表达式: 树形二叉树(图形显示) 中缀表达式为: 前缀表达式为: 后缀表达式为: 3.概要设计:(算法) 分成两部分完成: 【1】前缀、中缀、后缀表达式->二叉树表达式 前缀表达式->二叉树表达式:(a)碰到操作数则把其值赋给相应的新申请的二叉树结点,地址压栈;(b)碰到操作符则把其值赋给相应的新申请的二叉树,并从栈中弹出两个地址,分别作为其右指针和左指针,然后再把其地址压栈,最后一个地址即为二叉树的根结点地址。 中缀表达式->二叉树表达式:把中缀表达式转换成后缀表达式,然后再建立二

叉树。 后缀表达式->二叉树表达式:(a)碰到操作数则把其值赋给相应的新申请的二叉树结点,若栈为空则地址压栈,若非空则取栈顶元素,若栈顶元素的左孩子为空则当前结点设为其左孩子,左孩子为满则设为其右孩子再压栈;(b)碰到操作数则把其值赋给相应的新申请的二叉树结点,取栈顶元素,若栈顶元素的左孩子为空则设为其左孩子,左孩子为满则设为其右孩子开始那个元素地址为根结点地址,开始时用变量root保存。 【1】二叉树表达式->前缀、中缀、后缀表达式 二叉树表达式->前缀表达式:对二叉树表达式进行前序遍历。 二叉树表达式->中缀表达式:对二叉树表达式进行中序遍历,若结点操作符的优先级高于其左或右子树,在打印相应的子树之前先打印开括号,在打印相应的子树最后在打印一个闭括号。 二叉树表达式->后缀表达式:对二叉树表达式进行后序遍历。

算术表达式与二叉树课程设计

山西大学 课程设计任务书 设计题目算术表达式与二叉树 所属课程:数据结构 系别软件学院 专业软件工程 班级软工1408班 姓名霍志斌 指导教师李雪梅 设计任务下达日期 2015年 12 月15 日 设计时间2016年1月4日至 2016年1月8日

目录: 一、需求分析 二、概要设计 1、数据类型的声明: 2、表达式的抽象数据类型定义 3、整体设计 三、详细设计 1、二叉树的存储类型 2、顺序栈的存储类型 3、表达式的基本操作 4、主程序和其他伪码算法 5、函数的调用关系 四、设计和调试分析 五、测试 六、课程设计的心得和心得以及问题 一、需求分析【课程设计要求】 【问题的描述】 一个表达式和一棵二叉树之间,存在着自然的对应关系。写一个程序,实现基于二叉树表示的算术表达式Expression的操作。 【基本要求】 假设算术表达式Expression内可以含有变量(a-z),常量(0-9)和二元运算符(+,-,*,/,^(乘幂))。实现以下操作: (1)ReadExpr(E)――以字符序列的形式输入语法正确的前缀表达式并构造表达式E。 (2)WriteExpr(E)――用带括号的中缀表达式输出表达式E。

(3)Assign(V,c)――实现对变量V的赋值(V=c),变量的初值为0。 (4)Value(E)――对算术表达式E求值。 (5)CompoundExpr(p,E1,E2)――构造一个新的复合表达式(E1)p(E2)。【测试数据】 1)分别输入0;a;-91;+a*bc;+*5x2*8x;+++*3^*2^x2x6并输出。 2)每当输入一个表达式后,对其中的变量赋值,然后对表达式求值。 二、概要设计 1、数据类型的声明: 在这个课程设计中,采用了链表二叉树的存储结构,以及两个顺序栈的辅助存储结构 /*头文件以及存储结构*/ #include #include #include #include #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW 0 typedef int Status; 2、表达式的抽象数据类型定义 ADT Expression{ 数据对象D:D是具有数值的常量C和没有数值的变量V; 数据关系:R={<(V或者C)P(V或者C)>|V,C∈D, <(V或者C)P(V或者C)>表示由运算符P结合起来的表达式E} 基本操作: Status Input_Expr(&string,flag) 操作结果:以字符序列的形式输入语法正确的前缀表达式,保存到字符串string; 参数flag表示输出的提示信息是什么,输入成功返回OK,否则,返回ERROR。 void judge_value(&E,&string,i) 初始条件:树E存在,表达式的前缀字符串string存在; 操作结果:判断字符string[i],如果是'0'-'9'常量之间,二叉树结点E存为整 型;否则,存为字符型。 Status ReadExpr(&E,&exprstring) 初始条件:表达式的前缀形式字符串exprstring存在; 操作结果:以正确的前缀表示式exprstring并构造表达式E,构造成功,返回OK, 否则返回ERROR。 Status Pri_Compare(c1,c2)

相关文档
最新文档