二叉树的参数计算

二叉树的参数计算
二叉树的参数计算

实验六二叉树的参数计算

实验学时:2

实验类型:(综合型)

一、实验目的

1. 理解二叉树遍历算法的应用;

2. 掌握计算二叉树结点个数、高度、叶子结点个数算法实现;

3. 掌握交换二叉树左右子树以及复制一棵二叉树算法的实现;

4.

二、实验条件

Visual C++ 6.0

三、实验原理及相关知识

1.二叉树的存储结构描述;

2.求二叉树结点个数、高度、叶子结点个数算法的基本思想;

3.交换二叉树左右子树以及复制一棵二叉树算法的基本思想。

四、实验步骤

1.确定存储结构,写出二叉链表结构类型的具体定义。

2.二叉树参数计算的算法实现

(1)求结点个数、高度、叶子结点个数、交换二叉树左右子树以及复制一棵二叉树的递归算法的基本思想及算法实现;

(2)求结点个数、叶子结点个数的非递归算法的基本思想及算法实现;

五、思考题及其它

1. 二叉树遍历算法求解二叉树的其他相关问题。

2. 树的遍历算法的实现。

3. 赫夫曼编码和解码算法实现。

【参考程序】

#include

#include

#include

#define MaxSize 20

typedef int ElemType;

#define OK 1

int count;

typedef struct BiTNode

{

ElemType data;

struct BiTNode *lchild, *rchild;

}BiTNode,*BiTree;

//建立二叉树(按先序序列生成二叉树,#表示空节点)

void CreateBiTree(BiTree *T)

{

char ch;

scanf("%c",&ch);

getchar();/*回车键(每次输入一个字符后,需敲回车键)*/ if(ch=='#')

{

printf("不产生子树。\n");

*T=NULL;

}

else

{

if(!(*T=(BiTNode *)malloc(sizeof(BiTNode))))

{

printf("分配空间失败");

return;

}//生成一个新节点

(*T)->data = ch;

printf("产生左右子树。\n");

CreateBiTree(&((*T)->lchild)) ;

CreateBiTree(&((*T)->rchild)) ;

}

}

int Count_Tree(BiTree t)//计算二叉树的结点个数。

{

int lcount,rcount;

if(t==NULL) return 0;

lcount=Count_Tree(t->lchild); //求左子树的结点个数

rcount=Count_Tree(t->rchild); //求右子树的结点个数

return lcount+rcount+1;

}

int NCount_Tree(BiTree t)//非递归算法计算二叉树的结点个数。{

}

int Height(BiTree t) //计算二叉树的高度

{

int h1,h2;

if(t==NULL) return 0;

else

{

h1=Height(t->lchild); //求左子树的高度

h2=Height(t->rchild);

if(h1>h2) return h1+1; //求右子树的高度

return h2+1;

}

}

void Countleaf(BiTree t,int * count) //计算二叉树的叶子结点的个数

{

if(t==NULL) *count=0;

if(t->lchild==0 && t->rchild==0) (*count)++;

if(t->lchild!=0) Countleaf(t->lchild,count);

if(t->rchild!=0) Countleaf(t->rchild,count);

}

void NCountleaf(BiTree t,int *count) //非递归算法计算二叉树的叶子结点的个数{

}

void Swapbitree(BiTree t) //交换二叉树的左右子树

{

BiTree p;

if(t==NULL) return;

Swapbitree(t->lchild); Swapbitree(t->rchild);

p=t->lchild; t->lchild=t->rchild; t->rchild=p;

}

void Copybitree(BiTree t1,BiTree t2) //复制一棵二叉树

{

if (t1==NULL) {t2=NULL; return;}

t2=(BiTree)malloc(sizeof(BiTNode)); t2->data=t1->data;

Copybitree(t1->lchild,t2->lchild);

Copybitree(t1->rchild,t2->rchild);

}

void Preorder(BiTree T)

{

if(T)

{

printf("%c ",T->data);

Preorder(T->lchild);

Preorder(T->rchild);

}

}

void main()

{

BiTree T=NULL,T1=NULL;

int j;

int sign = 1;

int num;

count=0;

printf("本程序可以建立二叉树、求二叉树的结点个数、高度、叶子结点个数,交换二叉树的左右子树,复制一棵二叉树。\n");

printf("请将二叉树的先序序列输入以建立二叉树。\n");

printf("您必须一个一个地输入字符。\n");

while(sign)

{

printf("请选择: \n");

printf("1.生成二叉树(#表示空结点)\n");

printf("2.递归求结点个数 3.非递归求结点个数\n");

printf("4.递归求高度 5.递归求叶子结点个数\n");

printf("6.非递归求叶子结点个数7.递归交换二叉树左右子树\n");

printf("8.递归复制一棵二叉树9.输出二叉树\n");

printf("0.退出程序\n");

scanf("%d",&j);

getchar();

switch(j)

{

case 1:

printf("生成二叉树:");

CreateBiTree(&T);

printf("\n");

printf("\n");

break;

case 2:

if(T)

{

printf("递归求二叉树的结点个数:\n");

printf("二叉树的结点个数为:%d\n",Count_Tree(T));

}

else

printf("二叉树为空!\n");

break;

case 3:

if(T)

{

printf("非递归求二叉树的结点个数:\n");

printf("二叉树的结点个数为:%d\n",NCount_Tree(T));

}

else

printf("二叉树为空!\n");

break;

case 4:

if(T)

{

printf("递归求二叉树的高度:\n");

printf("二叉树的高度为:%d\n",Height(T));

}

else printf("二叉树为空!\n");

break;

case 5:

if(T)

{

printf("递归求二叉树的叶子结点个数:\n");

Countleaf(T,&count);

printf("二叉树的叶子结点个数为:%d\n",count);

}

else printf("二叉树为空!\n");

break;

case 6:

if(T)

{

printf("非递归求二叉树的叶子结点个数:\n");

NCountleaf(T,&count);

printf("二叉树的叶子结点个数为:%d\n",count);

}

else printf("二叉树为空!\n");

break;

case 7:

if(T)

{

printf("递归交换二叉树左右子树:\n");

Swapbitree(T);

Preorder(T);

printf("\n");

}

else printf("二叉树为空!\n");

break;

case 8:

if(T)

{

printf("递归复制二叉树左右子树:\n");

Copybitree(T,T1) ;

Preorder(T1);

printf("\n");

}

else printf("二叉树为空!\n");

break;

case 9:

if(T)

{

printf("二叉树的遍历序列为:");

Preorder(T);

printf("\n");

}

else printf("二叉树为空!\n");

break;

default:

sign=0;

printf("程序运行结束,按任意键退出!\n");

}

}

}

二叉树的基本参数计算

/*二叉树的基本参数计算*/ #include #include #define MaxSize 20 typedef int ElemType; #define OK 1 typedef struct BiTNode { ElemType data; struct BiTNode *lchild, *rchild; }BiTNode,*BiTree; //建立二叉树(按先序序列生成二叉树,#表示空节点) void CreateBiTree(BiTree *T) { char ch; scanf("%c",&ch); getchar();/*回车键(每次输入一个字符后,需敲回车键)*/ if(ch=='#') { printf("不产生子树。\n"); *T=NULL; } else { if(!(*T=(BiTNode *)malloc(sizeof(BiTNode)))) { printf("分配空间失败"); return; }//生成一个新节点 (*T)->data = ch; printf("产生左右子树。\n"); CreateBiTree(&(*T)->lchild); CreateBiTree(&(*T)->rchild); } } //交换左右子树产生新的树t返回到主函数 BiTNode *swap(BiTree T) { BiTree t,t1,t2; if(T==NULL) t=NULL; else {

t=(BiTNode*)malloc(sizeof(BiTNode)); t->data=T->data; t1=swap(T->lchild); //交换左右子树 t2=swap(T->rchild); t->lchild=t2; t->rchild=t1; } return(t); } //求树的叶子结点数 int leafs(BiTree T) { int num1,num2; if(T==NULL) return 0; else if(T->lchild==NULL&&T->rchild==NULL) return 1; else { num1=leafs(T->lchild); num2=leafs(T->rchild); return (num1+num2); } } //求二叉树的深度 int Depth(BiTNode *T) { int dep1,dep2; if(T==NULL) return(0); else { dep1=Depth(T->lchild); dep2=Depth(T->rchild); if(dep1>dep2) return(dep1+1); else return(dep2+1); } } //按广义表形式输出二叉树 void Disptree(BiTNode *T)

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

习题六树和二叉树 一、单项选择题 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 , 它的前序遍历是

数据结构课程设计---计算二叉树高度

数据结构课程设计---计算二叉树高度

学 号: 0121110860326 课程设计 题目数据结构(求二叉树 的高度) 学院计算机科学与技术 学院 专业物联网工程班级物联网1103班姓名孙雅川 指导教师耿枫

2013 年7 月 1 日 课程设计任务书 学生姓名:孙雅川专业班级:物联网1103班 指导教师:耿枫工作单位:计算机科学系 题目: 计算二叉树高度 对任一棵二叉树计算并输出其高度. (1)利用教材6.3节所述的扩展前序二叉树序列建立二叉树。 (2)测试用例自己设计. 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) 课程设计报告按学校规定格式用A4纸打印(书写),并应包含如下内容: 1、问题描述 简述题目要解决的问题是什么。 2、设计 存储结构设计、主要算法设计(用类C语言

或用框图描述)、测试用例设计; 3、调试报告 调试过程中遇到的问题是如何解决的;对设计和编码的讨论和分析。 4、经验和体会(包括对算法改进的设想) 5、附源程序清单和运行结果。源程序要加注释。如果题目规定了测试数据,则运行结果要包含这些测试数据和运行输出, 6、设计报告、程序不得相互抄袭和拷贝;若有雷同,则所有雷同者成绩均为0分。 时间安排: 1、第20周(6月29日至7月3日)完成。 2、7月3 日8:00到计算中心检查程序、交课程设计报告、源程序(CD盘)。 指导教师签名:年月日 系主任(或责任教师)签名:年月日

目录 1.引言 (6) 2.问题描述 (6) 3.实验设计 (6) 3.1.设计思想框图 (6) 3.2.设计要点 (7) 3.3具体设计 (7) 3.3.1存储结构设计 (7) 3.3.2主要算法设计 (7) 3.3.3测试用例设计 (8) 4.调试报告 (8) 4.1出现问题: (8) 4.2解决办法 (9) 5.源程序及测试结果 (9) 6.算法优化及运行结果 (11) 7.经验与体会 (13)

二叉树求节点数

二叉树求节点数 #include #include #include //函数状态码定义 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -1 #define INFEASIBLE -2 #define NULL 0 typedef int Status; typedef int TElemType; typedef struct BiTNode{ TElemType data; struct BiTNode *lchild,*rchild; }BitNode, *BiTree; Status PrintTElem(TElemType e) { printf("%d ",e); return OK; } Status CreateBiTree(BiTree &T){ TElemType e; scanf("%d",&e); if(e==0 )T=NULL; else{ T=(BiTree)malloc(sizeof(BiTNode)); if(!T)exit(OVERFLOW); T->data=e; CreateBiTree(T->lchild); CreateBiTree(T->rchild);

} return OK; } Status PreOrderTraverse(BiTree T,Status(*visit)(TElemType)) { if(T){ if( (*visit)(T->data) ) if( PreOrderTraverse(T->lchild,(*visit)) ) if( PreOrderTraverse(T->rchild,(*visit)) ) return OK; return ERROR; } else return OK; } int NodeCount(BiTree T){ //递归法统计所有结点的个数 int n; if(T==NULL)n=0; else n=1+NodeCount(T->lchild)+NodeCount(T->rchild); return n; } void main() { BiTree T; CreateBiTree(T); printf("二叉树T的先序输出序列为:"); PreOrderTraverse(T,PrintTElem); printf("\n"); printf("二叉树T的叶子节点数为 %d\n",NodeCount(T)); }

二叉树定价模型知识讲解

二叉树定价模型

期权定价的二叉树模型 Cox、Ross和Rubinstein提出了期权定价的另一种常用方法二叉树(binomial tree)模型,它假设标的资产在下一个时间点的价格只有上升和下降两种可能结果,然后通过分叉的树枝来形象描述标的资产和期权价格的演进历程。本章只讨论股票期权定价的二叉树模型,基于其它标的资产如债券、货币、股票指数和期货的期权定价的二叉树方法,请参考有关的书籍和资料。 8.1一步二叉树模型 我们首先通过一个简单的例子介绍二叉树模型。 例8.1 假设一只股票的当前价格是$20,三个月后该股票价格有可能上升到$22,也有可能下降到$18. 股票价格的这种变动过程可通过图8.1直观表示出来。 在上述二叉树中,从左至右的节点(实圆点)表示离散的时间点,由节点产生的分枝(路径)表示可能出现的不同股价。由于从开始至期权到期日只考虑了一个时间步长,图8.1表示的二叉树称为一步(one-step)二叉树。这是最简单的二叉树模型。

一般地,假设一只股票的当前价格是,基于该股票的欧式期权价格为。经过一个时间步(至到期日T)后该股票价格有可能上升到相应的期权价格为;也有可能下降到 相应的期权价格为. 这种过程可通过一步(one-step)二叉树表示出来,如图8.2所示。我们的问题是根据这个二叉树对该欧式股票期权定价。 为了对该欧式股票期权定价,我们采用无套利(no arbitrage)假设,即市场上无套利机会存在。构造一个该股票和期权的组合(portfolio),组合中有股的多头股票和1股空头期权。如果该股票价格上升到,则该组合在期权到期日的价值为;如果该股票价格下降到,则该组合在期 权到期日的价值为。根据无套利假设,该组合在股票上升和下降两种状态下的价值应该相等,即有 由此可得 (8.1) 上式意味着是两个节点之间的期权价格增量与股价增量之比率。在这种情况下,该组合是无风险的。以表示无风险利率,则该组合的现值(the present value)为 ,又注意到该组合的当前价值是,故有 即

数据结构中二叉树各种题型详解及程序

树是一种比较重要的数据结构,尤其是二叉树。二叉树是一种特殊的树,在二叉树中每个节点最多有两个子节点,一般称为左子节点和右子节点(或左孩子和右孩子),并且二叉树的子树有左右之分,其次序不能任意颠倒。二叉树是递归定义的,因此,与二叉树有关的题目基本都可以用递归思想解决,当然有些题目非递归解法也应该掌握,如非递归遍历节点等等。本文努力对二叉树相关题目做一个较全的整理总结,希望对找工作的同学有所帮助。 二叉树节点定义如下: structBinaryTreeNode { intm_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight; }; 相关链接: 轻松搞定面试中的链表题目 题目列表: 1. 求二叉树中的节点个数 2. 求二叉树的深度 3. 前序遍历,中序遍历,后序遍历 4.分层遍历二叉树(按层次从上往下,从左往右) 5. 将二叉查找树变为有序的双向链表 6. 求二叉树第K层的节点个数 7. 求二叉树中叶子节点的个数 8. 判断两棵二叉树是否结构相同 9. 判断二叉树是不是平衡二叉树 10. 求二叉树的镜像 11. 求二叉树中两个节点的最低公共祖先节点 12. 求二叉树中节点的最大距离 13. 由前序遍历序列和中序遍历序列重建二叉树 14.判断二叉树是不是完全二叉树 详细解答 1. 求二叉树中的节点个数 递归解法: (1)如果二叉树为空,节点个数为0 (2)如果二叉树不为空,二叉树节点个数= 左子树节点个数+ 右子树节点个数+ 1 参考代码如下: 1.int GetNodeNum(BinaryTreeNode * pRoot) 2.{ 3.if(pRoot == NULL) // 递归出口 4.return 0; 5.return GetNodeNum(pRoot->m_pLeft) + GetNodeNum(pRoot->m_pRight) + 1; 6.}

二叉树叶子结点个数计算

计算二叉树叶子结点 1.程序设计简介 已知一棵二叉树,求该二叉树中叶子结点的个数。 2.基本要求 (1)设计二叉树的二叉链表为存储结构 (2)设计求叶子结点个数的递归算法 (3)输入:一颗二叉树 (4)输出:二叉树中叶子结点的个数 3.实现提示 (1)存储设计 二叉树采用二叉链表为存储结构 (2)算法设计 求二叉树中叶子结点个数,即求二叉树的所有结点中左、右子树均为空的结点个数之和。可以将此问题转化为遍历问题,在遍历中“访问一个结点”时判断该结点是不是叶子,若是则将计数器累加。 4.源程序 #include #include using namespace std;

struct BiNode 行与测试 6.调试感想 非递归算法求叶子结点的个数 #include #include using namespace std; struct node { int data; node *lchild; node *rchild; }; node *root=NULL; void mid(node*root,int key=500) { int sum=0; stacks; while(NULL!=root || !()) { if(NULL!=root) {

(root); root=root->lchild; } else { root=(); // cout<data<<" "; if(NULL==root->lchild && NULL==root->rchild) ++sum; (); root=root->rchild; } } cout<data=100; node *a=new node; node *b=new node; node *a1=new node; node *a2=new node; node *b1=new node; node *b2=new node; a->data=200; b->data=300; a1->data=400; a2->data=500; b1->data=600; b2->data=700; root->lchild=a; root->rchild=b; a->lchild=a1; a->rchild=a2;

c语言实现一.二叉树操作 二.用栈实现算术表达式求值 课设报告

目录 题目一.二叉树操作(1)二.算术表达式求 (1) 一、课程设计的目的 (1) 二、课程设计的内容和要求 (1) 三、题目一设计过程 (2) 四、题目二设计过程 (6) 五、设计总结 (17) 六、参考文献 (18)

题目一.二叉树操作(1)二.算术表达式求 一、课程设计的目的 本学期我们对《数据结构》这门课程进行了学习。这门课程是一门实践性非常强的课程,为了让大家更好地理解与运用所学知识,提高动手能力,我们进行了此次课程设计实习。这次课程设计不但要求学生掌握《数据结构》中的各方面知识,还要求学生具备一定的C语言基础和编程能力。 (1)题目一的目的: 1、掌握二叉树的概念和性质 2、掌握二叉树的存储结构 3、掌握二叉树的基本操作 (2)题目二的目的: 1、掌握栈的顺序存储结构和链式存储结构 2、掌握栈的先进后出的特点 3、掌握栈的基本运算 二、课程设计的内容和要求 (1)题目一的内容和要求: 1、编写已知二叉树的先序、中序序列,恢复此二叉树的程序 2、编写求二叉树深度的程序 (2)题目二的内容和要求: 1、算术表达式由操作数、运算符和界限符组成。操作数是正整数,运算符为 加减乘除,界限符有左右括号和表达式起始 2、将一个表达式的中缀形式转化为相应的后缀形式 3、依据后缀表达式计算表达式的值

三、题目一设计过程 1、题目分析 现已知一棵二叉树的先序遍历序列和中序遍历序列,依次从先序遍历序列中取结点,由先序序列确定根结点(就是第一个字母),每次取出一个结点就与中序遍历的序列进行比较,当相等的时候,中序遍历序列就被分成以该结点为根的二叉树子树,该结点左部分为左子树,右部分为右子树,直到取完先序列里的所有结点,则二叉树构造完毕(树用链式存储结构存储),用递归实现! 由建好的二叉树,先判断这棵树是否为空,若不为空则找数的左子树,统计它的高度,然后找树的右子树,统计它的高度,比较左子树和右子树的高度,然后返回其中大的那个值加一,则求出数的高度。这里用递归实现! 2、算法描述 main ( )(主函数) 先构造一颗二叉树,初始化为空,用来存储所构造的二叉树,并输入一棵树的先序序列和中序序列,并统计这个序列的长度。然后调用实现功能的函数。 void CreateBiTree(BiTree *T,char *pre,char *in,int len)(由先序序列和中序序列构造二叉树) 根据前序遍历的特点, 知前序序列(pre)的首个元素(pre[0])为根(root), 然后在中序序列(in)中查找此根(pre[0]), 根据中序遍历特点, 知在查找到的根(root) 前边的序列为左子树, 后边的序列为右子树。设根前边有n个元素,则又有, 在前序序列中,紧跟着根(root)的n个元素序列(即pre[1...n]) 为左子树, 在后边的为右子树,而构造左子树问题其实跟构造整个二叉树问题一样,只是此时前序序列为pre[1...n]), 中序序列为in[0...n-1], 分别为原序列的子串, 构造右子树同样。这里用递归实现! int Depth(BiTree T)(求树的深度) 当所给的参数T是NULL时,返回0。说明这个树只有一个叶子节点深度为0,当所给的参数不是NULL时,函数调用自己看看这个参数的左分支是不是NULL,

数据结构—— 树和二叉树知识点归纳

第6章树和二叉树 6.1 知识点概述 树(Tree)形结构是一种很重要的非线性结构,它反映了数据元素之间的层次关系和分支关系。在计算机科学中具有广泛的应用。 1、树的定义 树(Tree)是n(n≥0)个数据元素的有限集合。当n=0时,称这棵树为空树。在一棵非空树T中: (1)有一个特殊的数据元素称为树的根结点,根结点没有前驱结点。 (2)若n>1,除根结点之外的其余数据元素被分成m(m>0)个互不相交的集合T1,T2,…,Tm,其中每一个集合Ti(1≤i≤m)本身又是一棵树。树T1,T2,…,Tm称为这个根结点的子树。 2、树的基本存储结构 (1)双亲表示法 由于树中的每一个结点都有一个唯一确定的双亲结点,所以我们可用一组连续的 存储空间(即一维数组)存储树中的结点。每个结点有两个域:一个是data域,存放结点信息,另一个是parent域,用来存放双亲的位置(指针)。 (2)孩子表示法 将一个结点所有孩子链接成一个单链表形,而树中有若干个结点,故有若干个单 链表,每个单链表有一个表头结点,所有表头结点用一个数组来描述这种方法通常是把每个结点的孩子结点排列起来,构成一个单链表,称为孩子链表。 (3)双亲孩子表示法 双亲表示法是将双亲表示法和孩子表示法相结合的结果。其仍将各结点的孩子结点分别组成单链表,同时用一维数组顺序存储树中的各结点,数组元素除了包括结点本身的信息和该结点的孩子结点链表的头指针之外,还增设一个域,存储该结点双亲结点在数组中的序号。 (4)孩子兄弟表示法 这种表示法又称为树的二叉表示法,或者二叉链表表示法,即以二叉链表作为树的存储结构。链表中每个结点设有两个链域,分别指向该结点的第一个孩子结点和下一个兄弟(右兄弟)结点。 3、二叉树的定义 二叉树(Binary Tree)是个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成。当集合为空时,称该二叉树为空二叉树。在二叉树中,一个元素也称作一个结点。 4、满二叉树 定义:在一棵二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子结点都在同一层上,这样的一棵二叉树称作满二叉树。 5、完全二叉树 定义:一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。完全二叉树的特点是:叶子结点只能出现在最下层和次下层,且最下层的叶子结点集中在树的左部。 6、二叉树的性质

数据结构——二叉树基本操作源代码

数据结构二叉树基本操作 (1). // 对二叉树的基本操作的类模板封装 //------------------------------------------------------------------------------------------------------------------------ #include using namespace std; //------------------------------------------------------------------------------------------------------------------------ //定义二叉树的结点类型BTNode,其中包含数据域、左孩子,右孩子结点。template struct BTNode { T data ; //数据域 BTNode* lchild; //指向左子树的指针 BTNode* rchild; //指向右子树的指针 }; //------------------------------------------------------------------------------------------------------------------------ //CBinary的类模板 template class BinaryTree { BTNode* BT; public: BinaryTree(){BT=NULL;} // 构造函数,将根结点置空 ~BinaryTree(){clear(BT);} // 调用Clear()函数将二叉树销毁 void ClearBiTree(){clear(BT);BT=NULL;}; // 销毁一棵二叉树 void CreateBiTree(T end); // 创建一棵二叉树,end为空指针域标志 bool IsEmpty(); // 判断二叉树是否为空 int BiTreeDepth(); // 计算二叉树的深度 bool RootValue(T &e); // 若二叉树不为空用e返回根结点的值,函数返回true,否则函数返回false BTNode*GetRoot(); // 二叉树不为空获取根结点指针,否则返回NULL bool Assign(T e,T value); // 找到二叉树中值为e的结点,并将其值修改为value。

习题树和二叉树

习题6树和二叉树 说明: 本文档中,凡红色字标出的题请提交纸质作业,只写题号和答案即可。 6.1 单项选择题 1. 2. A . 15 由于二叉树中每个结点的度最大为 2,所以二叉树是一种特殊的树,这种说法 A.正确 假定在一棵二叉树中, B . 16 C . 17 3. 按照二叉树的定义, A. 3 4. 按照二叉树的定义, A. 5 5. 6. 7. 8. B.错误 双分支结点数为15,单分支结点数为30个,则叶子结点数为 B 个。 D . 具有 B. 4 具有 B. 6 深度为5的二叉树至多有 A. 16 B. 32 47 3个结点的不同形状的二叉树有 _ C. 5 D. 6 3个不同数据结点的不同的二叉树有 C. 30 _C__个结点。 C. 31 D. 32 C 种。 C 种。 设高度为h 的二叉树上只有度为 0和度为 D. 10 2的结点,则此类二叉树中所包含的结点数至少为 B. 2h-1 C. 2h+1 m 个树叶,n 个结点,深度为h ,则__A__ B. h+m=2 n C. m=h-1 D. h+1 A. 2h 对一个满二叉树, A. n=h+m 任何一棵二叉树的叶结点在先序、中序和后序遍历序列中的相对次序 A.不发生改变 B.发生改变 如果某二叉树的前根次序遍历结果为 B. vwuts C. wuvts O D. n=2 h -1 A C.不能确定 D.以上都不对 stuwv ,中序遍历为uwtvs ,那么该二叉树的后序为 __C__。 D. wutsv 9. A. uwvts 10. 二叉树的前序遍历序列中,任意一个结点均处在其子女结点的前面,这种说法 正确 B.错误 11. 某二叉树的前序遍历结点访问顺序是 序遍历的结点访问顺序是 _D__。 A. bdgcefha B. gdbecfha 12. 在一非空二叉树的中序遍历序列中, A.只有右子树上的所有结点 C.只有左子树上的部分结点 abdgcefh ,中序遍历的结点访问顺序是 13. 如图6.1所示二叉树的中序遍历序列是 C. bdgaechf D. gdbehfca 根结点的右边 _A_。 B.只有右子树上的部分结点 D.只有左子树上的所有结点 B_。 C. dbaefcg D. defbagc 序遍 A. abcdgef 序列 B. dfebagc abdgcefh B. dgbaechf D. abcdefgh 为一棵二叉树上的两个结点, 前的条件是 B a 在b 的右方 a 是b 的祖先 a . C . 已知某二叉树的后序遍历序列是 B. deca b C. deab c D . a 是b 的子孙 dabec ,中序遍历序列是 D. cedba 16. A. acbe d 17.实现任意二叉树的后序遍历的非递归算法而不使用栈结构, 结构。 A.二叉链表 B.广义表存储结构 C.三叉链表 A. dgbaechf ,则其后 二叉树如图6.2所示,其中序遍历的 疋 D 。 B . a 在b 的左方 debac,它的前序遍历序列是 最佳方案是二叉树采用 D.顺序存储结构 C. 在中 C 存储

数据结构实验三——二叉树基本操作及运算实验报告

《数据结构与数据库》 实验报告 实验题目 二叉树的基本操作及运算 一、需要分析 问题描述: 实现二叉树(包括二叉排序树)的建立,并实现先序、中序、后序和按层次遍历,计算叶子结点数、树的深度、树的宽度,求树的非空子孙结点个数、度为2的结点数目、度为2的结点数目,以及二叉树常用运算。 问题分析: 二叉树树型结构是一类重要的非线性数据结构,对它的熟练掌握是学习数据结构的基本要求。由于二叉树的定义本身就是一种递归定义,所以二叉树的一些基本操作也可采用递归调用的方法。处理本问题,我觉得应该:

1、建立二叉树; 2、通过递归方法来遍历(先序、中序和后序)二叉树; 3、通过队列应用来实现对二叉树的层次遍历; 4、借用递归方法对二叉树进行一些基本操作,如:求叶子数、树的深度宽度等; 5、运用广义表对二叉树进行广义表形式的打印。 算法规定: 输入形式:为了方便操作,规定二叉树的元素类型都为字符型,允许各种字符类型的输入,没有元素的结点以空格输入表示,并且本实验是以先序顺序输入的。 输出形式:通过先序、中序和后序遍历的方法对树的各字符型元素进行遍历打印,再以广义表形式进行打印。对二叉树的一些运算结果以整型输出。 程序功能:实现对二叉树的先序、中序和后序遍历,层次遍历。计算叶子结点数、树的深度、树的宽度,求树的非空子孙结点个数、度为2的结点数目、度为2的结点数目。对二叉树的某个元素进行查找,对二叉树的某个结点进行删除。 测试数据:输入一:ABC□□DE□G□□F□□□(以□表示空格),查找5,删除E 预测结果:先序遍历ABCDEGF 中序遍历CBEGDFA 后序遍历CGEFDBA 层次遍历ABCDEFG 广义表打印A(B(C,D(E(,G),F))) 叶子数3 深度5 宽度2 非空子孙数6 度为2的数目2 度为1的数目2 查找5,成功,查找的元素为E 删除E后,以广义表形式打印A(B(C,D(,F))) 输入二:ABD□□EH□□□CF□G□□□(以□表示空格),查找10,删除B 预测结果:先序遍历ABDEHCFG 中序遍历DBHEAGFC 后序遍历DHEBGFCA 层次遍历ABCDEFHG 广义表打印A(B(D,E(H)),C(F(,G))) 叶子数3 深度4 宽度3 非空子孙数7 度为2的数目2 度为1的数目3 查找10,失败。

实现二叉树中所有节点左右子树的交换

数据结构课程设计 实验报告

题目名称:实现二叉树中所有节点左右子树的交换 学院:信息科学与工程学院 专业班级:计算机科学与技术 1003 班 姓名:叶成功 学号: 12081414 指导教师:陈国良教授李立三教授 日期: 2012年7月3日 目录 一、问题描述 (4) 二、基本要求 (4) 三、数据结构的设计 (4) 1、结点的数据结构 (5) 2、基本操作 (5) 四、软件模块结构图 (5) 五、程序设计思想 (6) 1、程序设计基本思想 (6) 2、程序设计基本思想 (7) 六、程序流程图 (7) 1、创建函数 (7) 2、前序遍历函数 (8) 3、中序遍历函数 (9) 4、后序遍历函数 (10) 5、层序遍历函数 (11) 6、左右子树交换函数 (13)

7、二叉树打印函数 (14) 8、遍历调用函数 (15) 9、菜单函数 (16) 10、主函数 (17) 七、源程序代码 (19) 八、调试分析 (25) 九、数据测试 (26) 1、主菜单界面 (27) 2、建立一棵有二十个结点的完全二叉树 (28) 3、打印二叉树 (28) 4、遍历二叉树 (28) 5、二叉树左右子树交换 (28) 6、交换后打印二叉树 (29) 7、交换后二叉树的遍历 (29) 8、退出程序 (29) 十、用户使用手册 (29) 十一、心得体会 (29)

一、问题描述 二叉树是一种常见的特殊的树型结构,在计算机领域有着极为广泛的应用。在二叉树的一些应用中,常常要求在树中查找具有某些特征的结点或者对树中全部结点逐一进行某种处理,这就提出了遍历二叉树。根据遍历的方向的不同,有前序遍历、中序遍历、后序遍历以及层序遍历。在本次课程设计中,要求学生通过编写程序完成对二叉树的一些操作,比如可以构造二叉树、打印二叉树、遍历二叉树以及对左右子树进行交换等等。 二、基本要求 要求:。构造一颗20个节点的完全二叉树或者20个节点以上的满二叉树。 实现如下步骤: (1)实现二叉树的构造过程,并打印出二叉树 (2)对该二叉树分别用层序、前序、中序和后序四种不同的方法进行遍历; (3)将该二叉树的所有左右子树进行交换,得到新的二叉树,并打印出该二叉树; (4)对新获得的二叉树分别用层序、前序、中序和后序四种不同的方法进行遍历。 三、数据结构的设计 由数据结构中二叉树的定义可知,二叉树的结点由一个数据元素和分别指向其左、右子树的两个分支构成,所以在本程序二叉树的构造是采用二叉链表的链式存储结构,链表中的结点应包含三个域:数据域和左、右孩子的指针域。这种存储结构可以方便二叉树的建立以及遍历。

东北大学计算机初试历年二叉树算法题目及解答

[1996] 设t 为一棵二叉树的根结点地址指针,试设计一个非递归算法完成把二叉树中每个结点的左右孩子位置交换。 int swithLRChild(BiTree *t) { BiTree *stack[100] = {0}; int stack_length = 0; if (NULL == t){ return 0; } stack[stack_length++] = t; while (stack_length > 0){ //pop stack BiTree *node = stack[stack_length - 1]; stack_length -= 1; BiTree *temp = node ->lchild; node->lchild = node ->rchild; node->rchild = temp; if (NULL != node ->rchild){ stack[stack_length++] = node ->rchild;} if (NULL != node ->lchild){ stack[stack_length++] = node ->lchild; } } return 1; } [1998]一棵高度为K 且有n个结点的二叉排序树,同时又是一棵完全二叉树存于向量t 中,试设计删除树中序号为i 且具有左右孩子的一个结点,而不使存储量增加保证仍为二叉排序树(不一定是完全二叉树)的算法。 //存数据的位置是从 1 的索引开始的,避免需要访问索引为0 的空间,避免需要频繁的索引 转换 void delNodeInSortedBiTree(int *sorted_bitree, int *last_index,int i) { //因为题目中描述具有左右孩子,所以直接从左孩子的最右边叶子节点开始//分两种情况,左孩子没有右孩子,那么左孩子之后的节点都移动一个位子//左孩子存在右孩子,则从右孩子的左孩子一直走,到叶子节点停止,因为是叶子节点//就不需要移动元素了 int del_node_index = 2*i; if (2*del_node_index + 1 >= *last_index)

实现二叉树中所有节点左右子树的交换

实现二叉树中所有节点左右子树的交换 IMB standardization office【IMB 5AB- IMBK 08- IMB 2C】

数据结构课程设计 实验报告 题目名称:实现二叉树中所有节点左右子树的交换学院:信息科学与工程学院 专业班级:计算机科学与技术1003班 姓名:叶成功 学号: 指导教师:陈国良教授李立三教授 日期:2012年7月3日 目录

一、问题描述 二叉树是一种常见的特殊的树型结构,在计算机领域有着极为广泛的应用。在二叉树的一些应用中,常常要求在树中查找具有某些特征的结点或者对树中全部结点逐一进行某种处理,这就提出了遍历二叉树。根据遍历的方向的不同,有前序遍历、中序遍历、后序遍历以及层序遍历。在本次课程设计中,要求学生通过编写程序完成对二叉树的一些操作,比如可以构造二叉树、打印二叉树、遍历二叉树以及对左右子树进行交换等等。

二、基本要求 要求:。构造一颗20个节点的完全二叉树或者20个节点以上的满二叉树。 实现如下步骤: (1)实现二叉树的构造过程,并打印出二叉树 (2)对该二叉树分别用层序、前序、中序和后序四种不同的方法进行遍历; (3)将该二叉树的所有左右子树进行交换,得到新的二叉树,并打印出该二叉树; (4)对新获得的二叉树分别用层序、前序、中序和后序四种不同的方法进行遍历。 三、数据结构的设计 由数据结构中二叉树的定义可知,二叉树的结点由一个数据元素和分别指向其左、右子树的两个分支构成,所以在本程序二叉树的构造是采用二叉链表的链式存储结构,链表中的结点应包含三个域:数据域和左、右孩子的指针域。这种存储结构可以方便二叉树的建立以及遍历。 1、结点的数据结构 structnode { chardata; structnode*lchild,*rchild; } 2、基本操作 voidCreate(BiTNode**p) 初始条件:按照结点的结构体构造二叉树; 操作结果:构造一棵二叉树。 voidPreOrderTraverse(BiTreeT)

数据结构二叉树习题含答案

第6章树和二叉树 1.选择题 (1)把一棵树转换为二叉树后,这棵二叉树的形态是()。 A.唯一的B.有多种 C.有多种,但根结点都没有左孩子D.有多种,但根结点都没有右孩子 (2)由3 个结点可以构造出多少种不同的二叉树?() A.2 B.3 C.4 D.5 (3)一棵完全二叉树上有1001个结点,其中叶子结点的个数是()。 A.250 B. 500 C.254 D.501 (4)一个具有1025个结点的二叉树的高h为()。 A.11 B.10 C.11至1025之间 D.10至1024之间(5)深度为h的满m叉树的第k层有()个结点。(1=

计算二叉树结点个数

#include #include #define maxlen 50 #define NULL 0 typedef struct node{ char data;//data域用来存放结点信息 struct node *lchild,*rchild;//lchild用来存放其左孩子的地址,rchild用来存放其右孩子的地址 }Bitree; Bitree *Q[maxlen];//定义指针队列 Bitree *creatBitree(){ char ch; int front=1,rear=0;//置空队列 Bitree *T,*S; T=NULL;//置空二叉树 ch=getchar(); while(ch!='#'){//以‘#’作为结束符 S=NULL;//当输入元素为空时,无需申请空间 if(ch!='@'){//当不是虚结点时 S=(Bitree *)malloc(sizeof(Bitree));//为所得元素申请内存 S->data=ch;//将元素值放入data域存储 S->lchild=S->rchild=NULL;//将其左右孩子置空 } rear++; Q[rear]=S;//将结点地址入队 if(rear==1){ T=S;}//输入的第一个元素为根结点 else{ if(S!=NULL&&Q[front]!=NULL) if(rear%2==0){ Q[front]->lchild=S;//能被2整除的rear位存储的皆为左孩子,将其与父节点连接 } else{ Q[front]->rchild=S;//不能被2整除的rear位存储的皆右左孩子,将其与父节点连接 } if(rear%2==1){ front++; } } ch=getchar(); } return T; }

二叉树的基本操作实验

实验三二叉树的基本运算 一、实验目的 1、使学生熟练掌握二叉树的逻辑结构和存储结构。 2、熟练掌握二叉树的各种遍历算法。 二、实验内容 [问题描述] 建立一棵二叉树,试编程实现二叉树的如下基本操作: 1. 按先序序列构造一棵二叉链表表示的二叉树T; 2. 对这棵二叉树进行遍历:先序、中序、后序以及层次遍历,分别输出结点的遍历序列; 3. 求二叉树的深度/结点数目/叶结点数目;(选做) 4. 将二叉树每个结点的左右子树交换位置。(选做) [基本要求] 从键盘接受输入(先序),以二叉链表作为存储结构,建立二叉树(以先序来建立), [测试数据] 如输入:ABCффDEфGффFффф(其中ф表示空格字符) 则输出结果为 先序:ABCDEGF 中序:CBEGDFA 后序:CGEFDBA 层序:ABCDEFG [选作内容] 采用非递归算法实现二叉树遍历。 三、实验前的准备工作 1、掌握树的逻辑结构。 2、掌握二叉树的逻辑结构和存储结构。 3、掌握二叉树的各种遍历算法的实现。 一实验分析 本次试验是关于二叉树的常见操作,主要是二叉树的建立和遍历。二叉树的遍历有多种方法,本次试验我采用递归法,递归法比较简单。 二概要设计 功能实现

1.int CreatBiTree(BiTree &T) 用递归的方法先序建立二叉树, 并用链表储存该二叉树 2.int PreTravel(BiTree &T) 前序遍历 3. int MidTravel(BiTree &T) 中序遍历 4.int PostTravel(BiTree &T) 后序遍历 5.int Depth(BiTree &T) //计算树的深度 6.int howmuch(BiTree T,int h) 采用树节点指针数组,用于存放遍历到的元素地址,如果有左孩子,存入地址,j加一,否则没操作,通过访问数组输出层次遍历的结果。k计算叶子数,j为总节点。 7. int exchang(BiTree &T) 交换左右子树,利用递归,当有左右孩子时才交换 三详细设计 #include #include typedef struct BiTNode { char data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree;

相关文档
最新文档