编写算法判别给定二叉树是否为完全二叉树(层次遍历)
数据结构-数据结构历年考题及答案2

中国矿业大学2011-2012学年《数据结构》试卷(A卷)(考试时间:100分钟)一. 填空(每空2分,共40分)1. 数据结构式具有相同性质的数据元素的(1)。
2. 通常程序在调用另一个程序时,都需要使用一个(2)来保存被调用程序内分配的局部变量、形式参数的存储空间以及返回地址。
3. 有6行8列的二维数组A,每个元素用相邻的6个字节存储,存储器按字节编址,已知A的起始存储地址(基址)为1000,在行优先存储和列优先存贮情况下A[5,5]的存储地址分别为__(3)_____,_____(4)____。
4. 完全二叉树第4 个节点的父节点是第 (5) 节点,左孩子是第 (6) 个节点。
如果该二叉树有10层,则共有 (7) 个节点。
5. 请描述在循环队列Q中,队头和队尾指针分别由front和rear表示,该队列有10个存储空间,判断队空和队满的条件分别分:_____(8)________,_______(9)_________。
6. 字符串t=”child”,s=”cake”,请写出下列函数的结果:StrLength(t) =(10)__;Concat(SubString(s,3,1),SubString(t,2,2))=____(11)___。
7. 一棵二叉树为则后序序列为(12),中序序列为(13),先序序列为__(14)____。
8. 请用数据序列{53,17,12,66,58,70,87,25,56,60 }构造一棵二叉排序树_(15)_。
9.。
一个栈输入的序列式1,2,3,则可能的且以2为开头的输出序列是 (16) ,不可能的序列是____(17)____。
10. 有n个结点的无向完全图的边数分别为_______(18)_______。
11. 要从数据:2,3,4,8,9,11,13查找11,若采用折半查找法,则在(19)次比较后,才找到该数据。
12. 在直接插入排序、希尔排序、冒泡排序和快速排序中,平均情况下(20)_____最快。
判断一棵树是否为满二叉树的算法c语言

判断一棵树是否为满二叉树的算法c语言判断一棵树是否为满二叉树的算法(C语言)满二叉树是一种特殊的二叉树,每个节点要么没有子节点,要么有两个子节点。
判断一棵树是否为满二叉树的算法可以通过以下步骤实现:1. 定义二叉树的数据结构在C语言中,可以使用结构体定义二叉树的节点。
每个节点包含一个数据域和两个指针域,分别指向左子节点和右子节点。
```cstruct TreeNode {int data;struct TreeNode* left;struct TreeNode* right;};```2. 实现判断函数编写一个递归函数,用于判断给定二叉树是否为满二叉树。
函数的输入参数为根节点指针,返回值为布尔类型。
```cint isFullBinaryTree(struct TreeNode* root) {// 如果根节点为空,则返回真if (root == NULL) {return 1;}// 如果只有一个子节点或没有子节点,则返回假if ((root->left == NULL && root->right != NULL) ||(root->left != NULL && root->right == NULL)) {return 0;}// 递归判断左子树和右子树return isFullBinaryTree(root->left) && isFullBinaryTree(root->right);}```3. 测试样例可以编写一些测试样例来验证判断函数的正确性。
例如,下面是一个满二叉树和一个非满二叉树的示例:```cint main() {// 满二叉树struct TreeNode* root1 = (struct TreeNode*)malloc(sizeof(struct TreeNode));root1->data = 1;root1->left = (struct TreeNode*)malloc(sizeof(struct TreeNode));root1->left->data = 2;root1->left->left = (struct TreeNode*)malloc(sizeof(struct TreeNode));root1->left->left->data = 4;root1->left->left->left = NULL;root1->left->left->right = NULL;root1->left->right = (struct TreeNode*)malloc(sizeof(struct TreeNode));root1->left->right->data = 5;root1->left->right->left = NULL;root1->left->right->right = NULL;root1->right = (struct TreeNode*)malloc(sizeof(struct TreeNode));root1->right->data = 3;root1->right->left = (struct TreeNode*)malloc(sizeof(struct TreeNode));root1->right->left->data = 6;root1->right->left->left = NULL;root1->right->left->right = NULL;root1->right->right = (struct TreeNode*)malloc(sizeof(struct TreeNode));root1->right->right->data = 7;root1->right->right->left = NULL;root1->right->right->right = NULL;// 非满二叉树struct TreeNode* root2 = (struct TreeNode*)malloc(sizeof(struct TreeNode));root2->data = 1;root2->left = (struct TreeNode*)malloc(sizeof(struct TreeNode));root2->left->data = 2;root2->left->left = (struct TreeNode*)malloc(sizeof(struct TreeNode));root2->left->left->data = 4;root2->left->left->left = NULL;root2->left->left->right = NULL;root2->right = (struct TreeNode*)malloc(sizeof(struct TreeNode));root2->right->data = 3;root2->right->left = NULL;root2->right->right = (struct TreeNode*)malloc(sizeof(struct TreeNode));root2->right->right->data = 7;root2->right->right->left = NULL;root2->right->right->right = NULL;// 判断是否为满二叉树if (isFullBinaryTree(root1)) {printf("root1是满二叉树\n");} else {printf("root1不是满二叉树\n");}if (isFullBinaryTree(root2)) {printf("root2是满二叉树\n");} else {printf("root2不是满二叉树\n");}return 0;}```运行上述代码,输出结果为:```root1是满二叉树root2不是满二叉树```根据以上算法和示例,我们可以判断一棵树是否为满二叉树。
计算机专业基础综合数据结构(树和二叉树)历年真题试卷汇编13

计算机专业基础综合数据结构(树和二叉树)历年真题试卷汇编13(总分:66.00,做题时间:90分钟)一、综合题(总题数:4,分数:12.00)1.已知下列字符A、B、C、D、E、F、G的权值分别为3、12、7、4、2、8,11,试填写出其对应哈夫曼树HT的存储结构的初态和终态。
【北京工业大学1998五(10分)】__________________________________________________________________________________________正确答案:(设T是一棵二叉树,除叶子结点外,其他结点的度数皆为2,若T中有6个叶结点,试问:(分数:6.00)(1).T树的最大可能深度Kmax=?最小可能深度Kmin=?__________________________________________________________________________________________ 正确答案:(正确答案:(1)T树的最大深度:Kmax=6(除根外,每层均是两个结点)。
T树的最小深度Kmin=4(具有6个叶子的完全二叉树是其中的一种形态)。
)(2).T树中共有多少非叶结点?__________________________________________________________________________________________ 正确答案:(正确答案:非叶子结点数是5(n2=n0—1)。
)(3).若叶结点的权值分别为1,2,3,4,5,6。
请构造一棵哈曼夫树,并计算该哈曼夫树的带权路径长度wp1。
【北京邮电大学1992一、3(15/3分)】__________________________________________________________________________________________正确答案:(正确答案:哈夫曼树见右图,其带权路径长度wp1=51。
二叉树的遍历及常用算法

⼆叉树的遍历及常⽤算法⼆叉树的遍历及常⽤算法遍历的定义:按照某种次序访问⼆叉树上的所有结点,且每个节点仅被访问⼀次;遍历的重要性:当我们需要对⼀颗⼆叉树进⾏,插⼊,删除,查找等操作时,通常都需要先遍历⼆叉树,所有说:遍历是⼆叉树的基本操作;遍历思路:⼆叉树的数据结构是递归定义(每个节点都可能包含相同结构的⼦节点),所以遍历也可以使⽤递归,即结点不为空则继续递归调⽤每个节点都有三个域,数据与,左孩⼦指针和右孩⼦之指针,每次遍历只需要读取数据,递归左⼦树,递归右⼦树,这三个操作三种遍历次序:根据访问三个域的不同顺序,可以有多种不同的遍历次序,⽽通常对于⼦树的访问都按照从左往右的顺序;设:L为遍历左⼦树,D为访问根结点,R为遍历右⼦树,且L必须位于R的前⾯可以得出以下三种不同的遍历次序:先序遍历操作次序为DLR,⾸先访问根结点,其次遍历根的左⼦树,最后遍历根右⼦树,对每棵⼦树同样按这三步(先根、后左、再右)进⾏中序遍历操作次序为LDR,⾸先遍历根的左⼦树,其次访问根结点,最后遍历根右⼦树,对每棵⼦树同样按这三步(先左、后根、再右)进⾏后序遍历操作次序为LRD,⾸先遍历根的左⼦树,其次遍历根的右⼦树,最后访问根结点,对每棵⼦树同样按这三步(先左、后右、最后根)进⾏层次遍历层次遍历即按照从上到下从左到右的顺序依次遍历所有节点,实现层次遍历通常需要借助⼀个队列,将接下来要遍历的结点依次加⼊队列中;遍历的应⽤“遍历”是⼆叉树各种操作的基础,可以在遍历过程中对结点进⾏各种操作,如:对于⼀棵已知⼆叉树求⼆叉树中结点的个数求⼆叉树中叶⼦结点的个数;求⼆叉树中度为1的结点个数求⼆叉树中度为2的结点个数5求⼆叉树中⾮终端结点个数交换结点左右孩⼦判定结点所在层次等等...C语⾔实现:#include <stdio.h>//⼆叉链表数据结构定义typedef struct TNode {char data;struct TNode *lchild;struct TNode *rchild;} *BinTree, BinNode;//初始化//传⼊⼀个指针令指针指向NULLvoid initiate(BinTree *tree) {*tree = NULL;}//创建树void create(BinTree *BT) {printf("输⼊当前结点值: (0则创建空节点)\n");char data;scanf(" %c", &data);//连续输⼊整形和字符时.字符变量会接受到换⾏,所以加空格if (data == 48) {*BT = NULL;return;} else {//创建根结点//注意开辟的空间⼤⼩是结构体的⼤⼩⽽不是结构体指针⼤⼩,写错了不会⽴马产⽣问题,但是后续在其中存储数据时极有可能出现内存访问异常(飙泪....) *BT = malloc(sizeof(struct TNode));//数据域赋值(*BT)->data = data;printf("输⼊节点 %c 的左孩⼦ \n", data);create(&((*BT)->lchild));//递归创建左⼦树printf("输⼊节点 %c 的右孩⼦ \n", data);create(&((*BT)->rchild));//递归创建右⼦树}}//求双亲结点(⽗结点)BinNode *Parent(BinTree tree, char x) {if (tree == NULL)return NULL;else if ((tree->lchild != NULL && tree->lchild->data == x) || (tree->rchild != NULL && tree->rchild->data == x))return tree;else{BinNode *node1 = Parent(tree->lchild, x);BinNode *node2 = Parent(tree->rchild, x);return node1 != NULL ? node1 : node2;}}//先序遍历void PreOrder(BinTree tree) {if (tree) {//输出数据printf("%c ", tree->data);//不为空则按顺序继续递归判断该节点的两个⼦节点PreOrder(tree->lchild);PreOrder(tree->rchild);}}//中序void InOrder(BinTree tree) {if (tree) {InOrder(tree->lchild);printf("%c ", tree->data);InOrder(tree->rchild);}}//后序void PostOrder(BinTree tree) {if (tree) {PostOrder(tree->lchild);PostOrder(tree->rchild);printf("%c ", tree->data);}}//销毁结点递归free所有节点void DestroyTree(BinTree *tree) {if (*tree != NULL) {printf("free %c \n", (*tree)->data);if ((*tree)->lchild) {DestroyTree(&((*tree)->lchild));}if ((*tree)->rchild) {DestroyTree(&((*tree)->rchild));}free(*tree);*tree = NULL;}}// 查找元素为X的结点使⽤的是层次遍历BinNode *FindNode(BinTree tree, char x) {if (tree == NULL) {return NULL;}//队列BinNode *nodes[1000] = {};//队列头尾位置int front = 0, real = 0;//将根节点插⼊到队列尾nodes[real] = tree;real += 1;//若队列不为空则继续while (front != real) {//取出队列头结点输出数据BinNode *current = nodes[front];if (current->data == x) {return current;}front++;//若当前节点还有⼦(左/右)节点则将结点加⼊队列if (current->lchild != NULL) {nodes[real] = current->lchild;real++;}if (current->rchild != NULL) {nodes[real] = current->rchild;real++;}}return NULL;}//层次遍历// 查找元素为X的结点使⽤的是层次遍历void LevelOrder(BinTree tree) {if (tree == NULL) {return;}//队列BinNode *nodes[1000] = {};//队列头尾位置int front = 0, real = 0;//将根节点插⼊到队列尾nodes[real] = tree;real += 1;//若队列不为空则继续while (front != real) {//取出队列头结点输出数据BinNode *current = nodes[front];printf("%2c", current->data);front++;//若当前节点还有⼦(左/右)节点则将结点加⼊队列if (current->lchild != NULL) {nodes[real] = current->lchild;real++;}if (current->rchild != NULL) {nodes[real] = current->rchild;real++;}}}//查找x的左孩⼦BinNode *Lchild(BinTree tree, char x) {BinTree node = FindNode(tree, x);if (node != NULL) {return node->lchild;}return NULL;}//查找x的右孩⼦BinNode *Rchild(BinTree tree, char x) {BinTree node = FindNode(tree, x);if (node != NULL) {return node->rchild;}return NULL;}//求叶⼦结点数量int leafCount(BinTree *tree) {if (*tree == NULL)return 0;//若左右⼦树都为空则该节点为叶⼦,且后续不⽤接续递归了else if (!(*tree)->lchild && !(*tree)->rchild)return 1;else//若当前结点存在⼦树,则递归左右⼦树, 结果相加return leafCount(&((*tree)->lchild)) + leafCount(&((*tree)->rchild));}//求⾮叶⼦结点数量int NotLeafCount(BinTree *tree) {if (*tree == NULL)return 0;//若该结点左右⼦树均为空,则是叶⼦,且不⽤继续递归else if (!(*tree)->lchild && !(*tree)->rchild)return 0;else//若当前结点存在左右⼦树,则是⾮叶⼦结点(数量+1),在递归获取左右⼦树中的⾮叶⼦结点,结果相加 return NotLeafCount(&((*tree)->lchild)) + NotLeafCount(&((*tree)->rchild)) + 1;}//求树的⾼度(深度)int DepthCount(BinTree *tree) {if (*tree == NULL)return 0;else{//当前节点不为空则深度+1 在加上⼦树的⾼度,int lc = DepthCount(&((*tree)->lchild)) + 1;int rc = DepthCount(&((*tree)->rchild)) + 1;return lc > rc?lc:rc;// 取两⼦树深度的最⼤值 }}//删除左⼦树void RemoveLeft(BinNode *node){if (!node)return;if (node->lchild)DestroyTree(&(node->lchild));node->lchild = NULL;}//删除右⼦树void RemoveRight(BinNode *node){if (!node)return;if (node->rchild)DestroyTree(&(node->rchild));node->rchild = NULL;}int main() {BinTree tree;create(&tree);BinNode *node = Parent(tree, 'G');printf("G的⽗结点为%c\n",node->data);BinNode *node2 = Lchild(tree, 'D');printf("D的左孩⼦结点为%c\n",node2->data);BinNode *node3 = Rchild(tree, 'D');printf("D的右孩⼦结点为%c\n",node3->data);printf("先序遍历为:");PreOrder(tree);printf("\n");printf("中序遍历为:");InOrder(tree);printf("\n");printf("后序遍历为:");PostOrder(tree);printf("\n");printf("层次遍历为:");LevelOrder(tree);printf("\n");int a = leafCount(&tree);printf("叶⼦结点数为%d\n",a);int b = NotLeafCount(&tree);printf("⾮叶⼦结点数为%d\n",b);int c = DepthCount(&tree);printf("深度为%d\n",c);//查找F节点BinNode *node4 = FindNode(tree,'C');RemoveLeft(node4);printf("删除C的左孩⼦后遍历:");LevelOrder(tree);printf("\n");RemoveRight(node4);printf("删除C的右孩⼦后遍历:");LevelOrder(tree);printf("\n");//销毁树printf("销毁树 \n");DestroyTree(&tree);printf("销毁后后遍历:");LevelOrder(tree);printf("\n");printf("Hello, World!\n");return 0;}测试:测试数据为下列⼆叉树:运⾏程序复制粘贴下列内容:ABDGHECKFIJ特别感谢:iammomo。
判断二叉树是否为完全二叉树的实例

判断二叉树是否为完全二叉树的实例判断二叉树是否为完全二叉树的实例完全二叉树是指除了最后一层之外,其他每一层的结点数都是满的,今天店铺为大家整理的判断二叉树是否为完全二叉树的'实例,仅供学习参考,欢迎大家阅读浏览!完全二叉树特点完全二叉树是指除了最后一层之外,其他每一层的结点数都是满的。
最后一层如果也满了,是一颗满二叉树,也是完全二叉树。
最后一层如果不满,缺少的结点也全部的集中在左边,那也是一颗完全二叉树。
import java.util.*;class TreeNode {int val = 0;TreeNode left = null;TreeNode right = null;public TreeNode(int val) {this.val = val;}}public class CheckCompletion {public boolean checking(TreeNode root) {Queue<TreeNode> queue = new LinkedList<TreeNode>();boolean leaf = false; // 叶子结点TreeNode left;TreeNode right;queue.add(root);while (!queue.isEmpty()) {root = queue.poll();left = root.left;right = root.right;if ((leaf&&(left!=null||right!=null)) || (left==null&&right!=null)) {// 如果之前层遍历的结点没有右孩子,且当前的结点有左或右孩子,直接返回false// 如果当前结点有右孩子却没有左孩子,直接返回falsereturn false;}if (left != null) {queue.offer(root.left);}if (right != null) {queue.offer(root.right);}else {leaf = false; // 如果当前结点没有右孩子,那么之后层遍历到的结点必须为叶子结点}}return true;}}感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!【判断二叉树是否为完全二叉树的实例】。
数据库系统l试题库及答案 第6章 树和二叉树

第6章树和二叉树6.1知识点: 树和二叉树的基本概念一、填空题1.高度为h,度为m的树中至少有___________个结点,至多有______________个结点。
2.树的结点是由及若干指向其子树的组成;结点拥有的子树数称为;度为0的结点称为;度不为0的结点成为;树中结点的最大度数称为;树的最大层次称为_____________。
3.对于一棵具有n个结点的树,该树中所有结点的度数之和为___________。
4.如果结点A有3个兄弟结点,而且B是A的双亲,则B的度是___________。
5.二叉树是另一种树形结构,它的特点是。
6.一颗度数为k且有2k-1个结点的二叉树称为。
7.深度为k,且有n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号从1到n的结点一一对应时,称之为。
8.一棵深度为6的满二叉树有个分支结点和个叶子。
9.一棵具有257个结点的完全二叉树,它的深度为。
10.设一棵完全二叉树具有1000个结点,则此完全二叉树有个叶子结点,有个度为2的结点,有个结点只有非空左子树,有个结点只有非空右子树。
11.由3个结点可以构成__________种形态的的二叉树,可以构成种形态的树。
12.将含有82个结点的完全二叉树从根结点开始顺序编号,根结点为第1号,其他结点自上向下,同一层自左向右连续编号。
则第40号结点的双亲结点的编号为。
13.一棵高度为5的完全二叉树中,最多包含有____________个结点。
14.一棵具有n个结点的二叉树,若它有n0个叶子结点,则该二叉树上度为1的结点n1=____________。
15.在高度为h(h>=0)的二叉树中至多可以有__________个结点,至少可以有___________个结点。
16.n个结点的二叉树最大高度是____________,最小高度是_______________。
二、选择题1.( )不含任何结点的空树()。
A.是一棵树B.是一棵二叉树C.是一棵树也是一棵二叉树D.既不是树也不是二叉树2.()一棵度为4的树中度为1、2、3、4的结点个数为4、3、2、1,则该树的结点总数为()。
《数据结构与算法》第六章-树与二叉树习题

《数据结构与算法》第二部分习题精选一、下面是有关二叉树的叙述,请判断正误()1. 若二叉树用二叉链表作存贮结构,则在n个结点的二叉树链表中只有n—1个非空指针域。
()2.二叉树中每个结点的两棵子树的高度差等于1。
()3.二叉树中每个结点的两棵子树是有序的。
()4.二叉树中每个结点有两棵非空子树或有两棵空子树。
()5.二叉树中每个结点的关键字值大于其左非空子树(若存在的话)所有结点的关键字值,且小于其右非空子树(若存在的话)所有结点的关键字值。
()6.二叉树中所有结点个数是2k-1-1,其中k是树的深度。
()7.二叉树中所有结点,如果不存在非空左子树,则不存在非空右子树。
()8.对于一棵非空二叉树,它的根结点作为第一层,则它的第i层上最多能有2i—1个结点。
()9.用二叉链表法(link-rlink)存储包含n个结点的二叉树,结点的2n个指针区域中有n+1个为空指针。
(√)10. 具有12个结点的完全二叉树有5个度为2的结点。
二、填空1.由3个结点所构成的二叉树有种形态。
2. 一棵深度为6的满二叉树有个分支结点和个叶子。
3.一棵具有257个结点的完全二叉树,它的深度为。
4.设一棵完全二叉树有700个结点,则共有个叶子结点。
5. 设一棵完全二叉树具有1000个结点,则此完全二叉树有个叶子结点,有个度为2的结点,有个结点只有非空左子树,有个结点只有非空右子树。
6.一棵含有n个结点的k叉树,可能达到的最大深度为,最小深度为。
7. 二叉树的基本组成部分是:根(N)、左子树(L)和右子树(R)。
因而二叉树的遍历次序有六种。
最常用的是三种:前序法(即按N L R次序),后序法(即按次序)和中序法(也称对称序法,即按L N R次序)。
这三种方法相互之间有关联。
若已知一棵二叉树的前序序列是BEFCGDH,中序序列是FEBGCHD,则它的后序序列必是。
8.中序遍历的递归算法平均空间复杂度为。
9.用5个权值{3, 2, 4, 5, 1}构造的哈夫曼(Huffman)树的带权路径长度是。
东北大学历年初试考研真题分享

21115
196
3314
186
5、(方向移动,试举例说明之。快速排序中有没有这种现象?
二、(15分)设有一个由正整数组成的无序(向后)单链表,编写完成下列功能的算法:
1、找出最小值结点,且打印该数值;
2、若该数值是奇数,则将其与直接后继结点的值交换;
3、若该数值是偶数,则将其直接后继结点删除;
三、(14分)解答下列问题:
1、(4分)将算术表达式((a+b)+c*(d+e)+f)*(g+h)转化为二叉树;
2、(10分)假设一个仅包含二元运算符的算术表达式以链表形式存储在二叉树b1中,写出计算该表达式值的算法。
四、(21分)解答下列问题:
1、(5分)画出有向图十字链表存储结构中头接点和表结点的结点结构。
5、设有1000个无序的元素,希望用最大的速度挑选出其中前十个最大的元素,在以下的方法中采用哪一种最好?为什么?(3分)
(快速排序,归并排序,堆排序,基数排序,shell排序)
二、(10分)两个正数序列A=a1,a2,a3,…..am和B=b1,b2,b3,…bn已经存入两个单链表中,设计一个算法,判别序列B是否是序列A的子序列。
(1)、构造出散列函数;(3分)
(2)、计算出等概率情况下查找成功的平均查找长度;(3分)
(3)、计算出等概率情况下查找失败的平均查找长度;(3分)
4、判别一下序列是否为堆,若不是,则把他调整为堆。
(1)(100,86,48,73,35,39,42,57,66,21)(4分)
(2)(12,70,33,65,24,56,48,92,86,33)(4分)
(4)在m阶B一树中每个结点上至少┌m/2┐有个关键字最多m有个关键字。
二叉树的各种遍历算法及其深度算法

二叉树的各种遍历算法及其深度算法一、二叉树的遍历算法二叉树是一种常见的数据结构,遍历二叉树可以按照根节点的访问顺序将二叉树的结点访问一次且仅访问一次。
根据遍历的顺序不同,二叉树的遍历算法可以分为三种:前序遍历、中序遍历和后序遍历。
1. 前序遍历(Pre-order Traversal):首先访问根节点,然后遍历左子树,最后遍历右子树。
可以用递归或者栈来实现。
2. 中序遍历(In-order Traversal):首先遍历左子树,然后访问根节点,最后遍历右子树。
可以用递归或者栈来实现。
3. 后序遍历(Post-order Traversal):首先遍历左子树,然后遍历右子树,最后访问根节点。
可以用递归或者栈来实现。
二、二叉树的深度算法二叉树的深度,也叫做高度,指的是从根节点到叶子节点的最长路径上的节点数目。
可以使用递归或者层次遍历的方式来计算二叉树的深度。
1.递归算法:二叉树的深度等于左子树的深度和右子树的深度的较大值加一、递归的终止条件是当节点为空时,深度为0。
递归的过程中通过不断递归左子树和右子树,可以求出二叉树的深度。
2.层次遍历算法:层次遍历二叉树时,每遍历完一层节点,深度加一、使用一个队列来辅助层次遍历,先将根节点加入队列,然后依次取出队列中的节点,将其左右子节点加入队列,直到队列为空,完成层次遍历。
三、示例为了更好地理解二叉树的遍历和求深度的算法,我们以一个简单的二叉树为例进行说明。
假设该二叉树的结构如下:A/\BC/\/\DEFG其中,A、B、C、D、E、F、G分别代表二叉树的结点。
1.前序遍历:A->B->D->E->C->F->G2.中序遍历:D->B->E->A->F->C->G3.后序遍历:D->E->B->F->G->C->A4.深度:2以上是针对这个二叉树的遍历和深度的计算示例。
数据结构实验三——二叉树基本操作及运算实验报告

《数据结构与数据库》实验报告实验题目二叉树的基本操作及运算一、需要分析问题描述:实现二叉树(包括二叉排序树)的建立,并实现先序、中序、后序和按层次遍历,计算叶子结点数、树的深度、树的宽度,求树的非空子孙结点个数、度为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,失败。
二叉树的常考算法题目

二叉树的常考算法题目
二叉树是计算机科学中常见的数据结构,以下是几个常见的二叉树相关算法题目:
1. 二叉树的深度:给定一个二叉树,求其深度。
2. 判断二叉树是否为完全二叉树:给定一个二叉树,判断它是否是完全二叉树。
3. 查找二叉树中的最大值和最小值:给定一个二叉树,找到其中的最大值和最小值。
4. 二叉树的镜像:给定一个二叉树,将其镜像(即左右节点交换)。
5. 反转二叉树:给定一个二叉树,将其反转。
6. 二叉树的左视图:给定一个二叉树,找到其左视图。
7. 二叉树的右视图:给定一个二叉树,找到其右视图。
8. 查找二叉树中的前驱节点和后继节点:给定一个二叉树和一个节点,找到该节点的前驱节点和后继节点。
9. 二叉树的层序遍历:给定一个二叉树,使用层序遍历的方式访问其节点。
10. 二叉树的先序遍历、中序遍历和后序遍历:给定一个二叉树,分别使用先序遍历、中序遍历和后序遍历的方式访问其节点。
这些题目是常见的二叉树算法题目,对于掌握二叉树相关算法非常重要。
吉林大学数据结构第三次上机实验题目

第三次上机
验证试验(必作题):
题目:二叉树相关算法的实验验证
[实验目的]
验证二叉树的链接存储结构及其上的基本操作。
[实验内容及要求]
1、定义链接存储的二叉树类。
2、实验验证如下算法的正确性、各种功能及指标:
1)创建一棵二叉树,并对其初始化;
2)先根、中根、后根遍历二叉树;
3)在二叉树中搜索给定结点的父结点;
4)搜索二叉树中符合数据域条件的结点;
3、由教师随机指定树结构,测试上述功能;
设计实验(选作题):
题目:判别给定二叉树是否为完全二叉树。
[实验目的]
在掌握二叉树的链接存储及基本操作的基础上,设计解决问题的算法。
[实验内容及要求]
设计算法判别给定二叉树t是否为完全二叉树;实现链接存储的二叉树类。
(完整)2016最新广工anyview数据结构答案

【题目】若两棵二叉树T1和T2皆为空,或者皆不空且T1的左、右子树和T2的左、右子树分别相似,则称二叉树T1和T2相似.试编写算法,判别给定两棵二叉树是否相似.二叉链表类型定义:typedef struct BiTNode {TElemType data;struct BiTNode *lchild, *rchild;} BiTNode, *BiTree;**********/Status Similar(BiTree T1, BiTree T2)/*判断两棵二叉树是否相似的递归算法*/{if(!T1&&!T2)//同为空时,两树相似return TRUE;else if(T1&&T1){if(Similar(T1 -> lchild,T2 -> lchild)&& Similar(T1 -> rchild,T2 —> rchild))//两树都不为空时,判断左右子树是否相似return TRUE;elsereturn FALSE;}else//以上两种情况都不符合,就直接返回FALSEreturn FALSE;}/**********【题目】编写递归算法,求对二叉树T先序遍历时第k个访问的结点的值。
二叉链表类型定义:typedef struct BiTNode {TElemType data;struct BiTNode *lchild, *rchild;} BiTNode, *BiTree;**********/TElemType PreOrder(BiTree T, int &k) {TElemType x=’#’;if(T==NULL)return '#';if(k==1)return T-〉data;if(T—>lchild!=NULL){k--;x=PreOrder(T—>lchild,k);}if(T->rchild!=NULL&&x==’#’){k—-;x=PreOrder(T-〉rchild, k);}return x;}TElemType PreOrderK(BiTree T, int k)/* 求对二叉树T先序遍历时第k个访问的结点的值。
江西理工大学数据结构考试大题,保过

1.掌握链表(包括单向、双向链表的插入和删除算法)2.给定二叉树的两种遍历序列,分别是:前序遍历序列:D,A,C,E,B,H,F,G,I;中序遍历序列:D,C,B,E,H,A,G,I,F,DAC FE GB H I3.试写出如图所示的二叉树分别按先序、中序、后序遍历时得到的结点序列。
(以及算法的实现)答:DLR:A B D F J G K C E H I L MLDR: B F J D G K A C H E L I MLRD:J F K G D B H L M I E C A4把如图所示的树转化成二叉树。
答:注意全部兄弟之间都要连线(包括度为2的兄弟),并注意原有连线结点一律归入左子树,新添连线结点一律归入右子树。
ABE CK F H DL G IM J5.画出和下列二叉树相应的森林。
答:注意根右边的子树肯定是森林,而孩子结点的右子树均为兄弟。
6.编写递归算法,计算二叉树中叶子结点的数目。
int LeafCount_BiTree(Bitree T)//求二叉树中叶子结点的数目{if(!T) return 0; //空树没有叶子else if(!T->lchild&&!T->rchild) return 1; //叶子结点else return Leaf_Count(T->lchild)+Leaf_Count(T->rchild);//左子树的叶子数加上右子树的叶子数}//LeafCount_BiTree7.编写算法判别给定二叉树是否为完全二叉树。
答:int IsFull_Bitree(Bitree T)//判断二叉树是否完全二叉树,是则返回1,否则返回0{InitQueue(Q);flag=0;EnQueue(Q,T); //建立工作队列while(!QueueEmpty(Q)){ { DeQueue(Q,p);if(!p) flag=1;else if(flag) return 0;else{ EnQueue(Q,p->lchild);EnQueue(Q,p->rchild); //不管孩子是否为空,都入队列}}//whilereturn 1;}//IsFull_Bitree8假设用于通信的电文仅由8个字母组成,字母在电文中出现的频率分别为0.17,0.09,0.02,0.06,0.32,0.13,0.11,0.10。
数据结构第六章考试题库(含答案)

第六章 树和二叉树一、选择题1.已知一算术表达式的中缀形式为 A+B*C-D/E ,后缀形式为ABC*+DE/-,其前缀形式为( )A .-A+B*C/DE B. -A+B*CD/E C .-+*ABC/DE D. -+A*BC/DE【北京航空航天大学 1999 一、3 (2分)】2.算术表达式a+b*(c+d/e )转为后缀表达式后为( )【中山大学 1999 一、5】A .ab+cde/*B .abcde/+*+C .abcde/*++D 3. 设有一表示算术表达式的二叉树(见下图),它所表示的算术表达式是( ) 【南京理工大学1999 一、20(2分)】 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-G4. 设树T 的度为4,其中度为1,2,3和4的结点个数分别为4,2,1,1 则T 中的叶子数为( )A .5B .6C .7D .8【南京理工大学 2000 一、8 (1.5分)】5. 在下述结论中,正确的是( )【南京理工大学 1999 一、4 (1分)】①只有一个结点的二叉树的度为0; ②二叉树的度为2; ③二叉树的左右子树可任意交换; ④深度为K 的完全二叉树的结点个数小于或等于深度相同的满二叉树。
A .①②③B .②③④C .②④D .①④6. 设森林F 对应的二叉树为B ,它有m 个结点,B 的根为p,p 的右子树结点个数为n,森林F 中第一棵树的结点个数是( )A .m-nB .m-n-1C .n+1D .条件不足,无法确定 【南京理工大学2000 一、17(1.5分)】7. 树是结点的有限集合,它( (1))根结点,记为T 。
其余结点分成为m (m>0)个((2))的集合T1,T2, …,Tm ,每个集合又都是树,此时结点T 称为Ti 的父结点,Ti 称为T 的子结点(1≤i ≤m )。
二叉树的四种遍历算法

⼆叉树的四种遍历算法⼆叉树作为⼀种重要的数据结构,它的很多算法的思想在很多地⽅都⽤到了,⽐如STL算法模板,⾥⾯的优先队列、集合等等都⽤到了⼆叉树⾥⾯的思想,先从⼆叉树的遍历开始:看⼆叉树长什么样⼦:我们可以看到这颗⼆叉树⼀共有七个节点0号节点是根节点1号节点和2号节点是0号节点的⼦节点,1号节点为0号节点的左⼦节点,2号节点为0号节点的右⼦节点同时1号节点和2号节点⼜是3号节点、四号节点和五号节点、6号节点的双亲节点五号节点和6号节点没有⼦节点(⼦树),那么他们被称为‘叶⼦节点’这就是⼀些基本的概念⼆叉树的遍历⼆叉树常⽤的遍历⽅式有:前序遍历、中序遍历、后序遍历、层序遍历四种遍历⽅式,不同的遍历算法,其思想略有不同,我们来看⼀下这四种遍历⽅法主要的算法思想:1、先序遍历⼆叉树顺序:根节点 –> 左⼦树 –> 右⼦树,即先访问根节点,然后是左⼦树,最后是右⼦树。
上图中⼆叉树的前序遍历结果为:0 -> 1 -> 3 -> 4 -> 2 -> 5 -> 62、中序遍历⼆叉树顺序:左⼦树 –> 根节点 –> 右⼦树,即先访问左⼦树,然后是根节点,最后是右⼦树。
上图中⼆叉树的中序遍历结果为:3 -> 1 -> 4 -> 0 -> 5 -> 2 -> 63、后续遍历⼆叉树顺序:左⼦树 –> 右⼦树 –> 根节点,即先访问左⼦树,然后是右⼦树,最后是根节点。
上图中⼆叉树的后序遍历结果为:3 -> 4 -> 1 -> 5 -> 6 -> 2 -> 04、层序遍历⼆叉树顺序:从最顶层的节点开始,从左往右依次遍历,之后转到第⼆层,继续从左往右遍历,持续循环,直到所有节点都遍历完成上图中⼆叉树的层序遍历结果为:0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6下⾯是四种算法的伪代码:前序遍历:preOrderParse(int n) {if(tree[n] == NULL)return ; // 如果这个节点不存在,那么结束cout << tree[n].w ; // 输出当前节点内容preOrderParse(tree[n].leftChild); // 递归输出左⼦树preOrderParse(tree[n].rightChild); // 递归输出右⼦树}中序遍历inOrderParse(int n) {if(tree[n] == NULL)return ; // 如果这个节点不存在,那么结束inOrderParse(tree[n].leftChild); // 递归输出左⼦树cout << tree[n].w ; // 输出当前节点内容inOrderParse(tree[n].rightChild); // 递归输出右⼦树}pastOrderParse(int n) {if(tree[n] == NULL)return ; // 如果这个节点不存在,那么结束pastOrderParse(tree[n].leftChild); // 递归输出左⼦树pastOrderParse(tree[n].rightChild); // 递归输出右⼦树cout << tree[n].w ; // 输出当前节点内容}可以看到前三种遍历都是直接通过递归来完成,⽤递归遍历⼆叉树简答⽅便⽽且好理解,接下来层序遍历就需要动点脑筋了,我们如何将⼆叉树⼀层⼀层的遍历输出?其实在这⾥我们要借助⼀种数据结构来完成:队列。
完全二叉树的判定算法

完全二叉树的判定算法完全二叉树是指除了最后一层,其他层的节点数都达到最大值,并且最后一层的节点都连续地排列在左边。
判断一个二叉树是否为完全二叉树,可以使用以下算法:1. 从根节点开始,按照广度优先搜索的顺序遍历二叉树节点。
2. 当遇到一个节点时,判断该节点的左子节点是否为空,如果为空,则进入第4步;否则,进入第3步。
3. 如果当前节点有右子节点,将其加入遍历队列,并继续遍历下一个节点。
如果当前节点没有右子节点,则转入第4步。
4. 从当前节点开始,遍历剩下的节点,并判断它们是否都是叶子节点(即没有左子节点和右子节点)。
如果遇到一个非叶子节点,则该二叉树不是完全二叉树;如果遍历完所有节点都没有遇到非叶子节点,则该二叉树是完全二叉树。
下面是一个示例的Python代码实现:```pythonclass TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightdef isCompleteTree(root):if not root:return Truequeue = [root]isLeaf = Falsewhile queue:node = queue.pop(0)if isLeaf and (node.left or node.right): return Falseif node.left:queue.append(node.left)else:isLeaf = Trueif node.right:queue.append(node.right)else:isLeaf = Truereturn True```该算法的时间复杂度是O(n),其中n是二叉树的节点数。
试写一算法判别给定的二叉树是否为二叉排序树,设此二叉树以二叉链表存储,且树中结点的关键字均不相同

#include<stdio.h>#include<stdlib.h>#define max 10typedef struct node{int data;node *lchild,*rchild;}Bitree;Bitree *B[max];int temp=0;int Btree[max];Bitree *Creatree(){ //建立二叉树Bitree *T,*S;int ch;int front,rear,sign;sign=0;front=0;rear=-1;T=NULL;printf("建立二叉树(1表示虚结点,0表示输入结束):\n");scanf("%d",&ch);while(ch!=0){if(ch!=1){ //输入结点不是虚结点S=(Bitree*)malloc(sizeof(Bitree));S->data=ch;S->lchild=S->rchild=NULL;rear++;B[rear]=S;if(rear==front){T=S;sign++;}else{if(sign%2==1) //寻找父结点B[front]->lchild=S;if(sign%2==0){B[front]->rchild=S;front++;}sign++;}}else{ //输入结点为虚结点if(sign%2==0)front++;sign++;}scanf("%d",&ch);}return T;}void Inorder(Bitree *T){ //中序遍历二叉树,并将每个结点数据存入数组中if(T!=NULL){Inorder(T->lchild);printf("%d\t",T->data);Btree[temp]=T->data;temp++;Inorder(T->rchild);}}int Judgesort_bitree(int Btree[]){ //判断是否是二叉树int i,sign=1;for(i=0;i<temp-1;i++){if(Btree[i]>Btree[i+1]){sign=0;break;}}return sign;}void Judgeout(int a){ //判断输出if(a==1)printf("给定二叉树是二叉排序树!\n");if(a==0)printf("给定二叉树不是二叉排序树!\n");}void main(){Bitree *T;T=Creatree();printf("中序遍历:\n");Inorder(T);printf("\n");}Judgeout(Judgesort_bitree(Btree));题目:试写一算法判别给定的二叉树是否为二叉排序树,设此二叉树以二叉链表存储,且树中结点的关键字均不相同。
完全二叉树判断标准

完全二叉树判断标准《完全二叉树判断标准:我眼中的神奇数学世界》嘿,你知道完全二叉树吗?这可是一个超级有趣的东西呢。
我第一次听到这个名字的时候,就感觉特别好奇。
完全二叉树就像是一群排列得特别整齐的小士兵。
它是一种二叉树,二叉树呢,就像一棵大树有两个分叉的树枝一样。
每个节点最多有两个子节点,就像我们的手,一只手最多能抓两个东西。
那完全二叉树到底有啥特别的判断标准呢?我来给你好好讲讲。
首先呀,它要是一棵二叉树,这是最基本的前提。
就好比你要当一个好学生,那首先得是个学生吧。
完全二叉树的高度可是很有讲究的。
它的高度是固定的,这个高度是从根节点开始算,一直到叶子节点。
叶子节点就是那些没有子节点的节点啦,就像树的最末端的小树叶。
假如这棵完全二叉树的高度是h,那它的节点数就有一定的范围。
这个范围就像一个小框框,把完全二叉树的节点数量框在里面呢。
节点数最少得是2的h次方个,最多呢是2的(h + 1)次方减1个。
你看,这就像给完全二叉树的人数定了个规则,不能太少也不能太多。
比如说,我画了一棵二叉树,我想知道它是不是完全二叉树。
我先数它的高度,发现高度是3。
那按照这个标准,它的节点数最少应该是2的3次方,也就是8个。
最多呢是2的4次方减1,也就是15个。
要是这个树的节点数不在这个范围里,那它肯定不是完全二叉树啦。
这就像我们玩游戏,要符合游戏规则一样,不符合这个节点数规则,就出局啦。
还有一个很重要的判断标准呢。
完全二叉树的叶子节点必须都在最下面两层。
这就像盖房子,最上面的屋顶下面两层得把所有的小瓦片(叶子节点)都放好。
如果有一个叶子节点跑到了上面去,那就不是完全二叉树了。
我有一次和同桌一起看一个二叉树的图,他说他觉得那是完全二叉树。
我就按照这个标准去看,发现有个小叶子节点孤零零地跑到了中间一层,我就说:“你看,这个小叶子跑错地方啦,这肯定不是完全二叉树。
”同桌还不太相信,我就给他仔细解释了这个规则,他才恍然大悟呢。
而且呀,在最下面一层的叶子节点必须是从左到右连续排列的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//主函数 int main() { BiTree T1; //char a[]={"AB#D##G#F##"}; char a[]={"ABC####"}; CreateBiTree(T1,a);//创建二叉树 cout<<"二叉树为:"<<endl; preorderlists(T1,visit);//广义表输出二叉树 cout<<endl; cout<<"上面二叉树:"; if(Complete(T1)) cout<<"是完全二叉树"; else cout<<"是非完全二叉树"; cout<<endl; return 0; }
bool Dequeue(LQueue&Q,BiTree &e)//出队 { LQueuePtr p; if(Q.front==Q.rear) return false; p=Q.front; Q.front=p->next; e=Q.front->data; delete p; return trபைடு நூலகம்e; } void visit(TElemType z) { cout<<z; } void CreateBiTree(BiTree &T,char S[],int &i) { i++; if(S[i]=='#') { T=NULL; return; } T=new BiTNode; T->data=S[i]; CreateBiTree(T->lchild,S,i); CreateBiTree(T->rchild,S,i); } void CreateBiTree(BiTree &T,char S[])//创建二叉树 { int i=-1; CreateBiTree(T,S,i); } void preorderlists(BiTree T,void visit(TElemType))//广义表输出 二叉树 { if(!T)
//名称:6.49 //功能:编写算法判别给定二叉树是否为完全二叉树 //作者:薛小超 //日期:2012.10.26 //*************************************************************** #include <iostream> using namespace std; typedef char TElemType; typedef struct BiTNode//定义声明结构体BiTNode { TElemType data; BiTNode *lchild,*rchild; }*BiTree; typedef struct QNode//定义声明结构体QNode { BiTree data; QNode *next; }*LQueuePtr; struct LQueue { LQueuePtr front,rear; }; void LQueueInit(LQueue&Q)//初始化队列 { Q.front=Q.rear=new QNode; Q.front->next=NULL; } void Enqueue(LQueue&Q,BiTree e)//入队 { LQueuePtr p; p=new QNode; p->data=e; Q.rear->next=p; Q.rear=p; p->next=NULL; }
{ cout<<"#"; return; } visit(T->data); if(T->lchild!=NULL||T->rchild!=NULL) { cout<<'('; preorderlists(T->lchild,visit); cout<<','; preorderlists(T->rchild,visit); cout<<')'; } } bool Complete(BiTree T)//层次遍历二叉树是否为完全二叉树 { bool f=false; BiTree p=T; LQueue Q; LQueueInit(Q); if(!T) return false; Enqueue(Q,p); while(Dequeue(Q,p)) { if(!p) f=true; else if(f) return false; else { Enqueue(Q,p->lchild); Enqueue(Q,p->rchild); } } return true; }