Java二叉树的遍历

合集下载

二叉树的遍历及常用算法

二叉树的遍历及常用算法

⼆叉树的遍历及常⽤算法⼆叉树的遍历及常⽤算法遍历的定义:按照某种次序访问⼆叉树上的所有结点,且每个节点仅被访问⼀次;遍历的重要性:当我们需要对⼀颗⼆叉树进⾏,插⼊,删除,查找等操作时,通常都需要先遍历⼆叉树,所有说:遍历是⼆叉树的基本操作;遍历思路:⼆叉树的数据结构是递归定义(每个节点都可能包含相同结构的⼦节点),所以遍历也可以使⽤递归,即结点不为空则继续递归调⽤每个节点都有三个域,数据与,左孩⼦指针和右孩⼦之指针,每次遍历只需要读取数据,递归左⼦树,递归右⼦树,这三个操作三种遍历次序:根据访问三个域的不同顺序,可以有多种不同的遍历次序,⽽通常对于⼦树的访问都按照从左往右的顺序;设: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。

数据结构(Java版)_郑州大学中国大学mooc课后章节答案期末考试题库2023年

数据结构(Java版)_郑州大学中国大学mooc课后章节答案期末考试题库2023年

数据结构(Java版)_郑州大学中国大学mooc课后章节答案期末考试题库2023年1.对不含相同元素的同一输入序列进行两组不同的、合法的入栈和出栈组合操作,所得的输出序列一定相同。

参考答案:错误2.在链队列中,即使不设置尾指针,也能进行入队操作。

参考答案:正确3.循环顺序队列和循环链队列都存在空间一处问题。

参考答案:错误4.直接选择排序的时间复杂度与关键字的初始排列无关。

参考答案:正确5.一个循环链表可以由给定的头指针或尾指针来唯一标识。

参考答案:正确6.所谓随机存取,就是通过首地址和元素的序号可以在O(1)的时间内找到指定的元素。

参考答案:正确7.快速排序在最坏情况下的时间复杂度是O(【图片】)。

参考答案:正确8.哈夫曼树是带权路径长度最短的树,路径上权值较大的结点离根较近()参考答案:正确9.在队列中存取数据元素的原则是()。

参考答案:先进先出10.将整数1、2、3、4依次进栈,则不可能得到的出栈序列是()。

参考答案:142311.完全二叉树的存储结构通常采用顺序存储结构()。

参考答案:正确12.在中序线索二叉树中,每一非空的线索均指向其祖先结点()参考答案:正确13.二叉树中序线索化后,不存在空指针域()参考答案:错误14.二叉树的层次遍历需要栈结构的支持。

参考答案:错误15.下列关于AOE网的叙述中,不正确的是()参考答案:任何一个关键活动提前完成,那么整个工程将会提前完成16.一棵非空的二叉树的先序遍历序列与后序遍历序列正好相反,则该二叉树一定满足()参考答案:只有一个叶子结点17.引入二叉线索树的目的是()参考答案:加快查找结点的前驱或后继的速度18.单源最短路径算法的时间复杂度为()参考答案:O()19.对6个不同的数据元素进行直接插入排序,最多需要进行()次关键字的比较。

参考答案:1520.完全二叉树中,若一个结点没有左孩子,则它必是树叶()。

参考答案:正确21.已知循环队列存储在一维数组A[0【图片】n]中,且队列非空时front和rear分别指向队首元素和队尾元素。

二叉树的遍历题目及答案

二叉树的遍历题目及答案

二叉树的遍历题目及答案1. 二叉树的基本组成部分是:根(N)、左子树(L)和右子树(R)。

因而二叉树的遍历次序有六种。

最常用的是三种:前序法(即按N L R次序),后序法(即按L R N 次序)和中序法(也称对称序法,即按L N R次序)。

这三种方法相互之间有关联。

若已知一棵二叉树的前序序列是BEFCGDH,中序序列是FEBGCHD,则它的后序序列必是 F E G H D C B 。

解:法1:先由已知条件画图,再后序遍历得到结果;法2:不画图也能快速得出后序序列,只要找到根的位置特征。

由前序先确定root,由中序先确定左子树。

例如,前序遍历BEFCGDH中,根结点在最前面,是B;则后序遍历中B一定在最后面。

法3:递归计算。

如B在前序序列中第一,中序中在中间(可知左右子树上有哪些元素),则在后序中必为最后。

如法对B的左右子树同样处理,则问题得解。

2.给定二叉树的两种遍历序列,分别是:前序遍历序列:D,A,C,E,B,H,F,G,I;中序遍历序列:D,C,B,E,H,A,G,I,F,试画出二叉树B,并简述由任意二叉树B的前序遍历序列和中序遍历序列求二叉树B的思想方法。

解:方法是:由前序先确定root,由中序可确定root的左、右子树。

然后由其左子树的元素集合和右子树的集合对应前序遍历序列中的元素集合,可继续确定root的左右孩子。

将他们分别作为新的root,不断递归,则所有元素都将被唯一确定,问题得解。

3、当一棵二叉树的前序序列和中序序列分别是HGEDBFCA和EGBDHFAC时,其后序序列必是A. BDEAGFHCB. EBDGACFHC. HGFEDCBAD. HFGDEABC答案:B4. 已知一棵二叉树的前序遍历为ABDECF,中序遍历为DBEAFC,则对该树进行后序遍历得到的序列为______。

A.DEBAFCB.DEFBCAC.DEBCFAD.DEBFCA[解析] 由二叉树前序遍历序列和中序遍历序列可以唯一确定一棵二叉树。

2022年全国计算机等级《二级JAVA》考前押密试题(5)

2022年全国计算机等级《二级JAVA》考前押密试题(5)

2022年全国计算机等级《二级JAVA》考前押密试题(5)2022年全国计算机等级《二级JAVA》考前押密试题(5)一、选择题(每小题1分,共40分)1.下面for循环语句的执行结果是()。

[1分]A.63B.74C.62D.732.向Applet传递参数的正确描述是()。

[1分]3.以下叙述中不属于Java语言特点的是()。

[1分]A.面向对象B.可移植性C.多线程D.宏定义4.下列选项默认的布局管理器不是BorderLayout的是()。

[1分]A.WindowB.PanelC.FrameD.Dialog5.SQL语言又称为()。

[1分]A.结构化定义语言B.结构化控制语言C.结构化查询语言D.结构化操纵语言6.在对象流中,对象的传送首先要将所传送的对象串行化,也就是实现Serializable接口。

下列代码中必须实现Serializable接口的类是()。

[1分]A.EmployeeB.InputC.StaffD.Stream7.下列方法与Applet显示无关的是()。

[1分]A.paint()B.update()C.draw()D.repaint()8.在文件类提供的方法中,用于创建目录的方法是()。

[1分]A.mkdir()B.mkdirs()C.list()D.listRoots()9.int型public成员变量MAX_LENGTH,该值保持为常数100,则定义这个变量的语句是()。

[1分]A.publicintMAX_LENGTH=100B.finalintMAX_LENGTH=100C.publicconstintMAX_LENGTH=100D.publicfinalintMAX_LENGTH=10010.按照Java的标识符命名规则,下列表示-个类的标识符正确的是()。

[1分]A.HelloworldB.HelloWorldC.helloworldD.helloWorld11.下面程序段的输出结果是()。

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

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

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

对应的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)的空间复杂度。

Java篇:树和Map

Java篇:树和Map

Java篇:树和MapJava篇:树和Map每次涉及到集合就想将Map拎出来单独看看,每次开始了解⼜似乎觉得没必要,⽽每次想到相关问题⼜只有隐隐约约的印象。

⽽提到Map就会想到TreeMap,就会想到红⿊树。

有关于树的概念我也总是这个状态,所以⼀起拎出来看看总结下加深印象。

概念部分皆参考⾃列在参考链接中的博⽂。

1、数据结构:树树的部分主要参考:1.1 树作为计算机中常⽤的数据机构--树(Tree),随着在计算机中应⽤越发⼴泛,衍⽣出了许多结构:树、⼆叉树、⼆叉查找树、平衡⼆叉树(AVL 树)、红⿊树、哈夫曼树(Huffman Tree)、多路查找树、B树、B+树、B*树、R树。

在计算机科学中,树(英语:tree)是⼀种抽象数据类型或是实现这种抽象数据类型的数据结构,⽤来模拟具有树状结构性质的数据集合。

它是由n(n>0)个有限节点组成⼀个具有层次关系的集合。

把它叫做“树”是因为它看起来像⼀棵倒挂的树,也就是说它是根朝上,⽽叶朝下的。

它具有以下的特点:①每个节点有零个或多个⼦节点;②没有⽗节点的节点称为根节点;③每⼀个⾮根节点有且只有⼀个⽗节点;④除了根节点外,每个⼦节点可以分为多个不相交的⼦树;然后你要知道⼀⼤堆关于树的术语:度,叶⼦节点,根节点,⽗节点,⼦节点,深度,⾼度。

1.2 ⼆叉树1.2.1 ⼆叉树⼆叉树:每个节点最多含有两个⼦树的树称为⼆叉树。

(我们⼀般在书中试题中见到的树是⼆叉树,但并不意味着所有的树都是⼆叉树。

)在⼆叉树的概念下⼜衍⽣出满⼆叉树和完全⼆叉树的概念满⼆叉树:除最后⼀层⽆任何⼦节点外,每⼀层上的所有结点都有两个⼦结点。

也可以这样理解,除叶⼦结点外的所有结点均有两个⼦结点。

节点数达到最⼤值,所有叶⼦结点必须在同⼀层上完全⼆叉树:若设⼆叉树的深度为h,除第 h 层外,其它各层 (1~(h-1)层) 的结点数都达到最⼤个数,第h层所有的结点都连续集中在最左边,这就是完全⼆叉树。

数据结构_二叉树的遍历_课程设计

数据结构_二叉树的遍历_课程设计

8
if(bt!=NULL)/*二叉树 bt 非空*/ { inorder(bt->lchild);/*中序遍历 bt 的左子树*/ printf("%c",bt->data);/*访问结点 bt*/ inorder(bt->rchild);/*中序遍历 bt 的右子树*/ } } void postorder(bitree *bt)/*后序序遍历二叉树*/ { if(bt!=NULL) { postorder(bt->lchild); postorder(bt->rchild); printf("%c",bt->data); } }
3.2.2 二叉树的中序递归遍历算法
void inorder(bitree *bt)/*中序序遍历二叉树*/ { if(bt!=NULL)/*二叉树 bt 非空*/ { inorder(bt->lchild);/*中序遍历 bt 的左子树*/ printf("%c",bt->data);/*访问结点 bt*/ inorder(bt->rchild);/*中序遍历 bt 的右子树*/ } }
图 1 “菜单”界面
图2
创建二叉树
5
图 3 二叉树的先序遍历
图4
二叉树的中序输出
6
图 5 二叉树的后序输出
五:实验总结 虽然做的过程中出现很多错误。但是最后还是一一纠正了,并在其中发现了自 身的不足,补学补差。最后终于完成了。
六:源程序附录
#include<stdio.h> #include<stdlib.h> typedef char datatype; typedef struct node { datatype data;/*数据元素*/ struct node *lchild,*rchild;/*指向左,右孩子*/ }bitree; bitree *root;/*二叉树结点类型定义*/ bitree *creatbitree(bitree *root)/*创建二叉树*/ { char ch;

二级JAVA真题2007年04月

二级JAVA真题2007年04月

2007年4月二级Java笔试试卷(考试时间90分钟,满分1OO分)一、选择题(1)~(35)每小题2分,共70分)下列各题A) 、B) 、C) 、D) 四个选项中,只有一个选项是正确的。

(1)下列叙述中正确的是A) 算法的效率只与问题的规模有关,而与数据的存储结构无关B) 算法的时间复杂度是指执行算法所需要的计算工作量C) 数据的逻辑结构与存储结构是一一对应的D) 算法的时间复杂度与空间复杂度一定相关(2)在结构化程序设计中,模块划分的原则是A) 各模块应包括尽量多的功能B) 各模块的规模应尽量大C) 各模块之间的联系应尽量紧密D) 模块内具有高内聚度、模块间具有低耦合度(3)下列叙述中正确的是A) 软件测试的主要目的是发现程序中的错误B) 软件测试的主要目的是确定程序中错误的位置C) 为了提高软件测试的效率,最好由程序编制者自己来完成软件测试的工作D) 软件测试是证明软件没有错误(4)下面选项中不属于面向对象程序设计特征的是A) 继承性B) 多态性C) 类比性D) 封装性(5)下列对队列的叙述正确的是A) 队列属于非线性表B) 队列按“先进后出”原则组织数据C) 队列在队尾删除数据D) 队列按“先进先出”原则组织数据(6)对下列二叉树A) DYBEAFCZX B) YDEBFZXCAC) ABDYECFXZ D) ABCDEFXYZ进行前序遍历的结果为(7)某二叉树中有n个度为2的结点,则该二叉树中的叶子结点数为A) n+1 B) n-1 C) 2n D) n/2(8)在下列关系运算中,不改变关系表中的属性个数但能减少元组个数的是A) 并B) 交C) 投影D) 笛卡儿乘积(9)在E-R图中,用来表示实体之间联系的图形是A) 矩形B) 椭圆形C) 菱形D) 平行四边形(10)下列叙述中错误的是A) 在数据库系统中.数据的物理结构必须与逻辑结构一致B) 数据库技术的根本目标是要解决数据的共享问题C) 数据库设计是指在已有数据库管理系统的基础上建立数据库D) 数据库系统需要操作系统的支持(11)Java语言与C++语言相比,最突出的特点是A) 面向对象B) 高性能C) 跨平台D) 有类库(12)下列叙述中,错误的是A) Java提供了丰富的类库B) Java最大限度地利用网络资源C) Java支持多线程D) Java不支持TCP/IP协议(13)在下列Java语言的包中,提供图形界面构件的包是A) java.io B) javax.swing C) D) java.rmi(14)下列叙述中,错误的是A) iavac.exe是Java的编译器B) javadoc.exe是Java的文档生成器C) iavaprof.exe是Java解释器的剖析工具D) javap.exe是Java的解释器(15)在执行Java程序时,将应用程序连接到调试器的选项是A) -D B) -debug C) -vexbosegs D) -mx(16)请阅读下面程序import java.io. *;public class TypeTransition {public static void main(String args[]){char a='a';int i=l00;long y=456L;int aa=a+i;long yy=y-aa;System.out.print("aa = "+aA) ;System.out.print("yy = "+yy);}程序运行结果是A) aa=197 yy=259 B) aa=177 yy=259C) aa=543 yy=288 D) aa=197 yy=333(17)请阅读下面程序public class OperatorsAndExpressions {void residual() {int i=100, j=30;float m=563.5f, n=4.0f;System.out.println(i%j);System.out.println(m%n);}public static void main(String args[]) {OperatorsAndExpressions OperAndExp=new OperatorsAndExpressions();//取模运算符在整数和浮点数中的应用OperAndExp.residual; } }程序运行结果是A) 10 B) 20 C) 10 D) 203.5 2.54.5 3.5(18)请阅读下面程序public class ForLoopStatement {public static void main(string []args){int i,j;for (i=1; i<5; i++) { //i循环for (j=1;j<=i;j++) //j循环System.out.print(i+"×"+j+"="+i*j+" ");System.out.println();}}}程序完成后,i循环和j循环执行的次数分别是A) 4,10 B) 8,9 C) 9,8 D) 10,10(19)下列叙述中,错误的是A) Java中,方法的重载是指多个方法可以共享同一个名字B) Java中,用abstract修饰的类称为抽象类,它不能实例化C) Java中,接口是不包含成员变量和方法实现的抽象类D) Java中,构造方法可以有返回值(20)请阅读下面程序public class ExampleStringBuffer{public static void main(String []args){StringBuffer sb=new StringBuffer("test");System.out.println("buffer="+sB) ;System.out.println("length="+sb.length());} }程序运行结果中在"length="后输出的值A) 10 B) 4 C) 20 D) 30(21)请阅读下面程序import java.io.*;public class ExceptionCatch {public static void main(String args[]) {try{FilelnputStream fis=new FilelnputStream("text");System.out.println("content of text is:");} catch(FileNotFoundException e) {System.out.println(e);System.out.println("message:"+e.getMessageO);e.printStackTrace(System.out);}____{System.out.println(e);}}}为保证程序正确运行,程序中下划线处的语句应是A) catch(FilelnputStream fis) B) e.printStackTrace()C) catch(IOException e) D) System.out.println(e)(22)下列叙述中,错误的是A) 所有的字节输入流都从InputStream类继承B) 所有的字节输出流都从OutputStream类继承C) 所有的字符输出流都从OutputStreamWriter类继承D) 所有的字符输入流都从Reader类继承(23)下列叙述中,正确的是A) 线程与进程在概念上是不相关的B) 一个线程可包含多个进程C) 一个进程可包含多个线程D) Java中的线程没有优先级(24)请阅读下面程序public class ThreadTest{public static void main(String args[]) (Thread t1=new Thread(new Hello());Thread t2=new Thread(new Hello());t1.start();t2.start();}}class Hello implements Runnable {int i;public void run() {while(true) {System.out.prinfin("Hello"+i++);if(i=5) break;}}}该程序创建线程使用的方法是A) 继承Thread类B) 实现Runnable接口C) t1.start() D) t2.start()(25)Java对I/O访问所提供的同步处理机制是A) 字节流B) 过滤流C) 字符流D) 压缩文件流(26)Java对文件类提供了许多操作方法,能获得文件对象父路径名的方法是A) getAbsolutePath() B) getParentFile()C) getAbsoluteFile() D) getName()(27)下列叙述中,错误的是A) Java中没有检测和避免死锁的专门机制B) 程序中多个线程互相等待对方持有的锁,可能形成死锁C) 为避免死锁,Java程序中可先定义获得锁的顺序,解锁是按加锁的反序释放D) 为避免死锁,Java程序中可先定义获得锁的顺序,解锁是按加锁的正序释放(28)请阅读下面程序public class ThreadTest {public static void main(String args[]) throws Exception{int i=0;Hello t=new Hello();while(true) {System.out.println("Good Moming"+i++);if (i==2 && t.isAlive()) {System. out.println("Main waiting for Hello!");t.join(); //等待t运行结束}if(i==5) break;}}}class Hello extends Thread {int i;public void run() {while(true){System.out.println("Hello"+i++);if (i==5) break;}}}为使该程序正确执行,下划线处的语句应是A) t.sleep() B) t.yield()C) t.interrupt() D) t.start()(29)Panel类的默认布局管理器是A) BorderLayout B) CardLayout C) FlowLayout D) GridBagLayout(30)下列叙述中,错误的是A) JButton类和标签类可显示图标和文本B) Button类和标签类可显示图标和文本C) AWT构件能直接添加到顶层容器中D) Swing构件不能直接添加到顶层容器中(31)下列叙述中,错误的是A) Applet的默认布局管理器是FlowLayoutB) JApplet中增加构件是加到JApplet的内容面板上,不是直接加到JApplet中C) JApplet的内容面板的默认布局管理器是BorderLayoutD) JApplet的内容面板的默认布局管理器是FlowLayout(32)在定制Applet的绘图功能时,应该使用的方法是A) init() B) start()C) paintComponent() D) paint()(33)下列叙述中,错误的是A) Applet事件处理机制与JavaApplication相同B) JApplet事件处理机制采用监听器方式C) Applet事件处理机制采用监听器方式D) JApplet事件处理机制不是采用监听器方式(34)为保护本地主机,对Applet安全限制中正确的是A) Applet可加载本地库或方法B) Applet可读、写本地计算机的文件系统C) Applet可向Applet之外的任何主机建立网络连接D) Applet不能运行任何本地可执行程序(35)J2SDK基本命令中能生成C语言头文件的命令是A) javah B) javap C) jar D) java二、填空题(每空2分,共30分)(1)在深度为7的满二叉树中,度为2的结点个数为【1】。

二叉树的遍历PPT-课件

二叉树的遍历PPT-课件

4 、二叉树的创建算法
利用二叉树前序遍历的结果可以非常方便地生成给定的
二叉树,具体做法是:将第一个输入的结点作为二叉树的 根结点,后继输入的结点序列是二叉树左子树前序遍历的 结果,由它们生成二叉树的左子树;再接下来输入的结点 序列为二叉树右子树前序遍历的结果,应该由它们生成二 叉树的右子树;而由二叉树左子树前序遍历的结果生成二 叉树的左子树和由二叉树右子树前序遍历的结果生成二叉 树的右子树的过程均与由整棵二叉树的前序遍历结果生成 该二叉树的过程完全相同,只是所处理的对象范围不同, 于是完全可以使用递归方式加以实现。
void createbintree(bintree *t) { char ch; if ((ch=getchar())==' ') *t=NULL; else { *t=(bintnode *)malloc(sizeof(bintnode)); /*生成二叉树的根结点*/ (*t)->data=ch; createbintree(&(*t)->lchild); /*递归实现左子树的建立*/ createbintree(&(*t)->rchild); /*递归实现右子树的建立*/ }
if (s.top>-1) { t=s.data[s.top]; s.tag[s.top]=1; t=t->rchild; }
else t=NULL; }
}
7.5 二叉树其它运算的实现
由于二叉树本身的定义是递归的,因此关于二叉树的许多 问题或运算采用递归方式实现非常地简单和自然。 1、二叉树的查找locate(t,x)
(1)对一棵二叉树中序遍历时,若我们将二叉树严
格地按左子树的所有结点位于根结点的左侧,右子树的所

java二叉树遍历算法

java二叉树遍历算法

java二叉树遍历算法
Java二叉树遍历是指通过沿着树的深度遍历每个节点来检索树中的所有节点的算法技术。

浅显地讲,它采用层次方式,从树根向下依次访问每个节点,直到抵达叶子节点。

它是一种非常有用的树检索算法,在不同的情况下可能用到不同的遍历策略,如前序遍历、中序遍历、后序遍历等。

通常情况下,Java二叉树遍历有三种常见的遍历模式,分别是前序遍历、中序遍历和后序遍历,每种遍历模式都有其特定的应用场景。

前序遍历的特性是对树的每个节点都按以下顺序访问:根节点、左子树节点和右子树节点,比较常用于树的克隆操作中;中序遍历是:左子树节点、根节点和右子树节点,很适合树形表示算法中的构建;后序遍历是:左子树节点、右子树节点和根节点,比较适合用于计算叶子节点的数量或者进行节点释放操作。

不论哪一种遍历模式,它们都具有共同的思想,即可以借助栈的数据结构,依次把当前的节点的右子树、节点本身和左子树依次放入栈中,以便进行下一轮的遍历,直到拿到一个空节点,就可以访问另一个节点。

因此,对于二叉树遍历,其实无论何种遍历策略,都是采用深度优先搜索作为基础,针对特定的需求采用某种访问策略,这样才能达到最佳的效果。

另外,Java 二叉树遍历 imooc 价值课程更是让构造Java树的难题变得更加容易,对于对Java 数据结构有兴趣的同学津津乐道!
本文介绍了Java二叉树遍历技术的知识背景,以及它的三种核心遍历模式,前序遍历、中序遍历和后序遍历。

作为一种有效的数据结构技术,Java二叉树遍历能方便地检索树中的所有节点,可以为树形算法的构建提供方便,受到许多技术人员的青睐,在日常的工作中也有着良好的应用前景。

java实现二叉树的基本操作

java实现二叉树的基本操作

java实现二叉树的基本操作一、二叉树的定义树是计算机科学中的一种基本数据结构,表示以分层方式存储的数据集合。

树是由节点和边组成的,每个节点都有一个父节点和零个或多个子节点。

每个节点可以对应于一定数据,因此树也可以被视作提供快速查找的一种方式。

若树中每个节点最多只能有两个子节点,则被称为二叉树(Binary Tree)。

二叉树是一种递归定义的数据结构,它或者为空集,或者由一个根节点以及左右子树组成。

如果左子树非空,则左子树上所有节点的数值均小于或等于根节点的数值;如果右子树非空,则右子树上所有节点的数值均大于或等于根节点的数值;左右子树本身也分别是二叉树。

在计算机中实现二叉树,通常使用指针来表示节点之间的关系。

在Java中,定义一个二叉树节点类的代码如下:```public class BinaryTree {int key;BinaryTree left;BinaryTree right;public BinaryTree(int key) {this.key = key;}}```在这个类中,key字段表示该节点的数值;left和right字段分别表示这个节点的左右子节点。

1. 插入节点若要在二叉树中插入一个节点,首先需要遍历二叉树,找到一个位置使得插入新节点后,依然满足二叉树的定义。

插入节点的代码可以写成下面这个形式:```public void insert(int key) {BinaryTree node = new BinaryTree(key); if (root == null) {root = node;return;}BinaryTree temp = root;while (true) {if (key < temp.key) {if (temp.left == null) {temp.left = node;break;}temp = temp.left;} else {if (temp.right == null) {temp.right = node;break;}temp = temp.right;}}}```上面的代码首先创建了一个新的二叉树节点,然后判断二叉树根是否为空,若为空,则将这个节点作为根节点。

二叉树的遍历课件

二叉树的遍历课件
二叉树的遍历
教学目标
通过本案例的学习,能够认识和了 解二叉树的遍历,进而掌握通过其中 两种遍历顺序推出第三种遍历顺序的 分析方法,并且能够举一反三。
遍历的概念
所谓遍历是指沿着某条搜索路线, 依次对二叉树中每个结点均做一次且仅 做一次访问。
遍历分为:前序遍历、中序遍历、 后序遍历。
2011年3月全国计算机等级考试笔试填空题第2题
一棵二叉树的中序遍历结果为 DBEAFC,前序遍历结果为ABDECF, 则后序遍历结果为 【 】 。
前序遍历:若二叉树非空,则先访问根节点,再 遍历左子树,最后遍历右子树。
前序遍历顺序:
A
B
C
DE
F
中序遍历:若二叉树非空,则先遍历左子树,再 访问根节点,最后遍历右子树。
中序遍历顺序:
A
B
C
DE
F
后序遍历:若二叉树非空,则先遍历左子树,再 遍历右子树,最后访问根节点。
后序遍历顺序:
A
B
C
DE
F
中序遍历: D B E A F C 前序遍历: A B D E C F
后序遍历
A
B
C
D EF
二叉树
总结:
我们这节课主要采用“案例驱动式”教 学方法讲解了二叉树的遍历,以案例方式讲 解通过其中两种遍历顺序推断出第三种遍历 顺序的分析方法。主要培养大家灵活运用知 识的能力和举一反三的分析能力。
拓展:
已知ቤተ መጻሕፍቲ ባይዱ叉树的 后序遍历:D A B E C 中序遍历:D E B A C
请问前序遍历结果为?

先序中序后序遍历二叉树例题

先序中序后序遍历二叉树例题

先序中序后序遍历二叉树例题二叉树的先序、中序和后序遍历是树的三种常见遍历方式。

假设我们有以下二叉树作为例题:
A.
/ \。

B C.
/ \ \。

D E F.
1. 先序遍历(Preorder Traversal),先访问根节点,然后递归地先序遍历左子树,最后递归地先序遍历右子树。

遍历顺序为根-左-右。

对于上述例题,先序遍历的结果为,A, B, D, E, C, F。

2. 中序遍历(Inorder Traversal),先递归地中序遍历左子树,然后访问根节点,最后递归地中序遍历右子树。

遍历顺序为左-根-右。

对于上述例题,中序遍历的结果为,D, B, E, A, C, F。

3. 后序遍历(Postorder Traversal),先递归地后序遍历左子树,然后递归地后序遍历右子树,最后访问根节点。

遍历顺序为左-右-根。

对于上述例题,后序遍历的结果为,D, E, B, F, C, A。

需要注意的是,先序、中序和后序遍历的结果都是唯一的,即给定一棵二叉树,它们的遍历结果是确定的。

希望以上例题能够帮助你理解二叉树的先序、中序和后序遍历方式。

如果还有其他问题,请继续提问。

二叉树的四种遍历算法

二叉树的四种遍历算法

⼆叉树的四种遍历算法⼆叉树作为⼀种重要的数据结构,它的很多算法的思想在很多地⽅都⽤到了,⽐如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 ; // 输出当前节点内容}可以看到前三种遍历都是直接通过递归来完成,⽤递归遍历⼆叉树简答⽅便⽽且好理解,接下来层序遍历就需要动点脑筋了,我们如何将⼆叉树⼀层⼀层的遍历输出?其实在这⾥我们要借助⼀种数据结构来完成:队列。

二叉树的遍历算法

二叉树的遍历算法

二叉树的前序、后序的递归、非递归遍历算法学生姓名:贺天立指导老师:湛新霞摘要本课程设计主要解决树的前序、后序的递归、非递归遍历算法,层次序的非递归遍历算法的实现。

在课程设计中,系统开发平台为Windows 2000,程序设计设计语言采用Visual C++,程序运行平台为Windows 98/2000/XP。

用除递归算法前序,后续,中序遍历树外还通过非递归的算法遍历树。

程序通过调试运行,初步实现了设计目标,并且经过适当完善后,将可以应用在商业中解决实际问题。

关键词程序设计;C++;树的遍历;非递归遍历1 引言本课程设计主要解决树的前序、后序的递归、非递归遍历算法,层次序的非递归遍历算法的实现。

1.1课程设计的任务构造一棵树并输入数据,编写三个函数,非别是树的前序递归遍历算法、树的后序递归遍历算法、树的非递归中序遍历算法(这里的非递归以中序为例)。

在主程序中调用这三个函数进行树的遍历,观察用不同的遍历方法输出的数据的顺序和验证递归与非递归输出的数据是否一样。

1.2课程设计的性质由要求分析知,本设计主要要求解决树的前序、后序的递归、非递归遍历算法,层次序的非递归遍历算法的实现。

所以设计一个良好的前序、后序的递归、非递归遍历算法非常重要。

1.3课程设计的目的在程序设计中,可以用两种方法解决问题:一是传统的结构化程序设计方法,二是更先进的面向对象程序设计方法[1]。

利用《数据结构》课程的相关知识完成一个具有一定难度的综合设计题目,利用C语言进行程序设计。

巩固和加深对线性表、栈、队列、字符串、树、图、查找、排序等理论知识的理解;掌握现实复杂问题的分析建模和解决方法(包括问题描述、系统分析、设计建模、代码实现、结果分析等);提高利用计算机分析解决综合性实际问题的基本能力。

树的遍历分为前序、中序和后序,可以用递归算法实现树的三种遍历。

除了递归外还可以构造栈,利用出栈和入栈来实现树的前序遍历、中序遍历和后序遍历。

第7章树和二叉树(4)-数据结构教程(Java语言描述)-李春葆-清华大学出版社

第7章树和二叉树(4)-数据结构教程(Java语言描述)-李春葆-清华大学出版社

if (p.node.rchild!=null)
//有右孩子时将其进队
qu.offer(new QNode(p.lno+1,p.node.rchild));
}
}
return cnt;
}
7/31
解法2
层次遍历中某层的最右结点last
last
A
B
C
D
EF
G
last的作用确定一层是否遍历完成!
8/31
用cnt变量计第k层结点个数(初始为0)。设计队列仅保存结点引用, 置当前层次curl=1,用last变量指示当前层次的最右结点(根结点)进队。 将根结点进队,队不空循环:
int curl=1;
//当前层次,从1开始
BTNode<Character> last;
//当前层中最右结点
last=bt.b;
//第1层最右结点
qu.offer(bt.b);
//根结点进队
while (!qu.isEmpty())
{ if (curl>k) return cnt; p=qu.poll(); if (curl==k) cnt++; if (p.lchild!=null) { q=p.lchild; qu.offer(q); } if (p.rchild!=null) { q=p.rchild; qu.offer(q); } if (p==last) { last=q; curl++; }
}
Queue<QNode> qu=new LinkedList<QNode>(); //定义一个队列qu
QNode p;
qu.offer(new QNode(1,bt.b)); //根结点(层次为1)进队

基于java数据结构实验 二叉树实验报告

基于java数据结构实验  二叉树实验报告

实验报告p=p.getLeft();}}}运行结果:二叉搜索树:实验总结:通过这次实验,我掌握了二叉树的结构原理以及它的先序,中序,后序遍历,运用递归的方法实现和不用递归的方法实现。

二叉搜索树的原理和算法实现,根据二叉搜索树的特点,运用二分法进行二叉搜索树的一系列操作。

附:源程序:二叉树:package tree;import java.util.Deque;import java.util.LinkedList;public class BinaryTree<T>{private BinaryTreeNode root;public BinaryTree(BinaryTreeNode root) { super();this.root = root;}public BinaryTree() {this.root=null;}public BinaryTreeNode getRoot() {return root;}public void setRoot(BinaryTreeNode root) { this.root = root;}@Overridepublic String toString() {return "BinaryTree [root=" + root + "]";}private void preorder(BinaryTreeNode p) { if(p!=null) {System.out.print(p.getData()+"\t");preorder(p.getLchild());preorder(p.getRchild());}}public void preorder() {System.out.println("先序遍历:");preorder(root);}private void inorder(BinaryTreeNode p) { if(p!=null) {inorder(p.getLchild());System.out.print(p.getData()+"\t");inorder(p.getRchild());}}public void inorder() {System.out.println("中序遍历:");inorder(root);}private void postorder(BinaryTreeNode p) { if(p!=null) {postorder(p.getLchild());postorder(p.getRchild());System.out.print(p.getData()+"\t");}}public void postorder() {System.out.println("后序遍历:");postorder(root);}private int size(BinaryTreeNode p) {if(p==null) {return 0;}int lchildsize=size(p.getLchild());int rchildsize=size(p.getRchild());return lchildsize+rchildsize+1;}public int size() {System.out.println("节点数为:");return size(root);}private int height(BinaryTreeNode p) {if (p==null) {return 0;}int hl=height(p.getLchild());int hr=height(p.getRchild());return (hl>hr)?hl+1:hr+1;}public int height() {System.out.println("高度为:");return height(root);}public void showleaves(BinaryTreeNode p) {if (p!=null) {if (p.getLchild()==null&&p.getRchild()==null) {System.out.print(p.getData()+"\t");}showleaves(p.getLchild());showleaves(p.getRchild());}}public void pretravel() {BinaryTreeNode p=root;Deque<BinaryTreeNode> mystack=new LinkedList<BinaryTreeNode>();if(p!=null) {mystack.push(p);while(!mystack.isEmpty()) {p=mystack.pop();System.out.print(p.getData()+" ");if(p.getRchild()!=null) {mystack.push(p.getRchild());}if (p.getLchild()!=null) {mystack.push(p.getLchild());}}}}}二叉搜索树package tree;public class BinartSearchtree {private Node root;public BinartSearchtree(Node root) { super();this.root = root;}public BinartSearchtree() {root=null;}public void insearch(int x) {if(root==null) {root=new Node(x);return;}Node p=root;while (p!=null) {if(x>p.getData()) {if(p.getRight()==null) {p.setRight(new Node(x));return;}p=p.getRight();}else {if (p.getLeft()==null) {p.setLeft (new Node(x));return;}p=p.getLeft();}}}public Node find(int x) {Node p=root;while(p!=null) {if(x>p.getData()) {p=p.getRight();}else if(x<p.getData()) {p=p.getLeft();}else {return p;}}return null;}public void preorder() {System.out.println("先序遍历:");preorder(root);}private void preorder(Node p) {if(p!=null) {System.out.print(p.getData()+" ");preorder(p.getLeft());preorder(p.getRight());}}public Node minNode(Node p) {// Node p=root;while(p.getLeft()!=null) {p=p.getLeft();}return p;}public Node maxNode(Node p) {// Node p=root;while(p.getRight()!=null) {p=p.getRight();}return p;}public Node delete(int x, Node p) {Node temp;if(p==null) {System.out.println("error");return null;}else if (x<p.getData()) {p.setLeft(delete(x, p.getLeft()));}else if (x>p.getData()) {p.setRight(delete(x, p.getRight()));}else {if (p.getLeft()!=null&&p.getRight()!=null) { temp=maxNode(p.getLeft());p.setData(temp.getData());p.setLeft(delete(p.getData(), p.getLeft()));}else {if (p.getLeft()==null) {p=p.getRight();}else if (p.getRight()==null) {p=p.getRight();}}}return p;}。

全国计算机等级考试二年级Java语言程序设计试题及答案五

全国计算机等级考试二年级Java语言程序设计试题及答案五

全国计算机等级考试二年级J a v a语言程序设计试题及答案五Company number:【0089WT-8898YT-W8CCB-BUUT-202108】一、选择题(每小题1分,共40小题,共40分)1.常采用的两种存储结构是( )。

A.顺序存储结构和链式存储结构B.散列方法和索引方式C.链表存储结构和数组D.线性存储结构和非线性存储结构A。

【解析】线性表的存储结构有顺序存储结构和链式存储结构。

2.在深度为5的满二叉树中,叶子结点的个数为( )。

A.32B.31C.16D.15C。

【解析】根据满二叉树的定义,一棵深度为k且有2k-1个结点的二叉树为满二叉树。

满二叉树的叶子结点为最后一层的结点数。

根据满二叉树的性质,在满二叉树的第i层上至多有2i-1个结点。

因此深度为5的满二叉树的叶子结点数为25-1=16个。

3.下列叙述中错误的是( )。

A.线性表是由n个元素组成的一个有限序列B.线性表是一种线性结构C.线性表的所有结点有且仅有一个前件和后件D.线性表可以是空表C。

【解析】线性表是一种线性结构,由n(n≥0)个元素组成,所以线性表可以是空表。

但是在线性表中,第一个结点没有前驱,最后一个结点没有后继,其他结点有且只有一个前驱和后继,所以选项C是错误的。

4.数据库技术的根本目标是要解决数据的( )。

A.存储问题B.共享问题C.安全问题D.保护问题B。

【解析】在数据库系统中,需要对数据进行集合、统一的管理,以达到被多个应用程序共享的目标。

5.在设计程序时,应采纳的原则之一是( )。

A.不限制goto语句的使用B.减少或取消注解行C.程序越短越好D.程序结构应有助于读者理解D。

【解析】程序设计中,程序不要求长度,以结构清晰、易于理解为标准,程序员可以添加注释来助于理解,同时要尽量少用goto语句,否则会破坏程序的结构。

6.结构化程序设计的核心和基础是( )。

A.结构化分析方法B.结构化设计方法C.结构化设计理论D.结构化编程方法C。

二叉树的遍历

二叉树的遍历

T->rchild= CreatBiTree(); /*构造右子树*/ 扩展先序遍历序列
}
2021/2/21
return (T) ;}
A B Φ D Φ Φ C Φ 17Φ
T
T
T
ch=B
ch=Φ
Λ
T
T= Λ, Creat(T)
ch=A T
A
B creat(T L)
ΛB 返回
creat(T L)
creat(T R)
A
p=p->RChild;
}
2021/2/21
}
top
A
B
C
D
top
B
top
A
A
top
D
A
top
A
top
C
13
top
中序遍历二叉树的非递归算法:
A
void InOrder(BiTree T)
{ InitStack(&S); 相当于top=-1;
p=T;
B
C
while(p!=NULL | | !IsEmpty(S)) 相当于top==-1;
}
后序遍历二叉树的递归算法:
void PostOrder (BiTree T)
{ if(T!=NULL)
{ PostOrder (T->lchild);
PostOrder (T->rchild);
printf(T->data); }
2021/2/21
15
}
先序遍历二叉树的递归算法: void PreOder (BiTree T) { if(T! =NULL){ printf (T->data); PreOrder (T->lchild); PreOrder (T->rchild); } }
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
recursePreOrder(root.left);
if (root.right != null)
recursePreOrder(root.right);
}
public static void stackPreOrder(TreeNode root) {
树节点定义:
class TreeNode {
public TreeNode left;
public TreeNode right;
public int value;
public TreeNode(TreeNode left, TreeNode right, int value) {
System.out.println("Stack Pre Order Traverse");
stackPreOrder(root);
}
}
用LinkedList重写的Stack:
import java.util.EmptyStackException;
el)
return 0;
if (root.left == null && root.right == null)
return 1;
return 1 + Math
.max(getTreeHeight(root.left), getTreeHeight(root.right));
this.left = left;
this.right = right;
this.value = value;
}
}
二叉树及其操作:
public class BinaryTree {
public static int getTreeHeight(TreeNode root) {
}
public Object pop() {
if (empty())
throw new EmptyStackException();
return list.removeLast();
}
public void push(Object o) {
}
public static void recurseInOrder(TreeNode root) {
if (root == null)
return;
if (root.left != null)
recurseInOrder(root.left);
BinaryTree root =new BinaryTree(data[0]);
System.out.print("二叉树的中的数据: ");
for(int i=1;i{
root.insertTree(root,data[i]);
System.out.print(data[i-1]+";");
import java.util.LinkedList;
public class Stack {
private LinkedList list;
public Stack() {
this.list = new LinkedList();
}
public boolean empty() {
TreeNode node4 = new TreeNode(node2, node3, 4);
TreeNode node5 = new TreeNode(null, null, 5);
TreeNode root = new TreeNode(node4, node5, 0);
while (temp != null) {
stack.push(temp);
System.out.println(temp.value);
temp = temp.left;
}
temp = (TreeNode) stack.pop();
return list.isEmpty();
}
public Object peek() {
if (empty())
throw new EmptyStackException();
return list.getLast();
System.out.println(temp.value);
temp = temp.right;
while (temp != null) {
stack.push(temp);
temp = temp.left;
temp = temp.left;
}
if (stack.empty())
break;
temp = (TreeNode) stack.pop();
}
System.out.println(root.value);
if (root.right != null)
recurseInOrder(root.right);
}
public static void stackInOrder(TreeNode root) {
System.out.println("Tree Height is " + getTreeHeight(root));
System.out.println("Recurse In Order Traverse");
recurseInOrder(root);
public class BinaryTreeTest
{
public static void main(String args[])
{
BinaryTreeTest b=new BinaryTreeTest();
int data[]={12,11,34,45,67,89,56,43,22,98};
list.add(o);
}
public static void main(String[] args) {
Stack stack = new Stack();
stack.push(new Integer(1));
stack.push(new Integer(11));
stack.push(new Integer(1111));
stack.push(new Integer(22));
stack.push(new Integer(222));
stack.push(new Integer(31));
}
System.out.println(data[data.length-1]);
int key=Integer.parseInt(args[0]);
if(b.searchkey(root,key))
{
System.out.println("找到了:"+key);
}
while (temp != null) {
stack.push(temp);
temp = temp.left;
}
temp = (TreeNode) stack.pop();
while (temp != null) {
System.out.println("Stack In Order Traverse");
stackInOrder(root);
System.out.println("Recurse Pre Order Traverse");
recursePreOrder(root);
}
public static void recursePreOrder(TreeNode root) {
if (root == null)
return;
System.out.println(root.value);
if (root.left != null)
TreeNode node1 = new TreeNode(null, null, 1);
TreeNode node2 = new TreeNode(null, node1, 2);
TreeNode node3 = new TreeNode(null, null, 3);
stack.push(new Integer(221));
while (!stack.empty()) {
System.out.println(stack.pop());
}
}
}
------------------------------------------------------------------------------
}
if (stack.empty())
break;
temp = (TreeNode) stack.pop();
}
}
public static void main(String[] args) {
while (temp != null) {
temp = temp.right;
while (temp != null) {
stack.push(temp);
System.out.println(temp.value);
Stack stack = new Stack();
if (root == null)
return;
stack.push(root);
System.out.println(root.value);
相关文档
最新文档