数据结构笔记
文章平均质量分 51
武睿傲雪
喜欢在CSDN专业的技术论坛上提问题并解决问题
展开
-
设计一个算法,判断一个二叉树是否为完全二叉树
思想:根据完全二叉树的定义,对完全二叉树按照从上到下、从左到右的层次遍历,应该满足一下两条要求:●某节点没有左孩子,则一定无右孩子●若某节点缺左或右孩子,则其所有后继一定无孩子若不满足上述任何一条,均不为完全二叉树。算法思路:采用层序遍历算法,用cm变量值表示迄今为止二叉树为完全二叉树(其初值为1,一旦发现不满足上述条件之一,则置cm为0),bj变量值表示迄今为止所有节点均原创 2015-07-08 01:26:23 · 32516 阅读 · 10 评论 -
设计一个算法,采用BFS方式输出图G中从顶点u到v的最短路径(不带权的无向连通图G采用邻接表存储)
思想:图G是不带权的无向连通图,一条边的长度计为1,因此,求带顶点u和顶点v的最短的路径即求顶点u和顶点v的边数最少的顶点序列。利用广度优先遍历算法,从u出发进行广度遍历,类似于从顶点u出发一层一层地向外扩展,当第一次找到顶点v时队列中便包含了从顶点u到顶点v最近的路径,如图所示,再利用队列输出最路径(逆路径),所以设计成非循环队列。原创 2015-07-18 10:35:45 · 10979 阅读 · 1 评论 -
设计一个算法,求不权无向图连通图G中距离顶点v的最远的一个顶点
思想:图G是不带权的无向连通图,一条边的长度为1,因此,求距离顶点v的最远的顶点,即求距离顶点v的边数最多的顶点。利用广度优先遍历算法,从v出发进行广度遍历,类似于从顶点v出发一层层地向外扩展,到达j, …,最后到达的一个顶点k即为距离v最远的顶点。遍历时利用队列逐层暂存各个顶点,最后出队的一个顶点k即为所求。如图所示:对原创 2015-07-18 09:44:15 · 11601 阅读 · 6 评论 -
设计一个算法,输出从u到v的所有最短路径(采用邻接表存储)
思想:用path数组存放路径(初始为空),d表示路径长度(初始为-1),查找从顶点u到v的最短路径过程如图所示:对应算法如下:void FindPath(AGraph *G,int u,int v,int path[ ],int d){in原创 2015-07-18 11:24:15 · 6709 阅读 · 1 评论 -
二叉树遍历的非递归算法
所谓二叉树的遍历,就是按照某种次序访问二叉树中每个节点,而且每个节点仅访问一次的过程。以L,N,R分别表示遍历左子树、访问根节点和遍历右子树,则可能有NLR、LNR、LRN、NRL、RNL、RLN等六种遍历方式。若限定先左后右,则只有前三种遍历,分别称为先序遍历、中序遍历、后序遍历,另外还有一种层序的遍历方式。由于遍历的递归算法比较简单,这里只介绍遍历的非递归算法。这里给二叉链存储结构中节点类原创 2015-07-03 16:19:15 · 1136 阅读 · 0 评论 -
设计一个算法,求非空二叉树b的宽度(即具有节点最多的那一层的节点个数)
思想:假设二叉树采用二叉链存储结构,采用层次遍历的方法求出所有节点的层次,并将所有节点和对应的层次放在一个队列中。然后通过扫描队列求出各层的节点总数,最大的层节点总数即为二叉树的宽度。对应的算法如下:int BTWidth(BTNode *b){struct{BTNode *data[MaxSize];//保存队列的节点指针int level[MaxSize];/原创 2015-07-05 16:42:47 · 3166 阅读 · 0 评论 -
设计一个算法求节点值为x和节点y值得两个节点的最近共同祖先
思想:采用非递归后序遍历二叉树b.当找到节点值为x的节点时将栈中所有节点值存放在anorx数组中(如图所示的二叉树,F节点的anorx为“ACF”),当找到节点值为y的节点时将栈中所有节点值存放在anory数组中(对于如图所示的二叉树,E节点的anory为“ACE”),当两个节点均已找到后,通过比较找到他们最近的公共祖先(对于如图所示的二叉树,F和E节点的最近公共祖先为C),对应的算法如下:原创 2015-07-06 23:55:59 · 2889 阅读 · 0 评论 -
设计一个算法,输出从每个叶子节点到根节点的逆路径
下面使用三种遍历方法输出逆路径,假设二叉树采用二叉链存储结构存储。方法1:采用基于层次遍历的方法,设计的队列为非环形顺序队列,将所有已扫描的节点指针进队,并在队列中保存双亲节点的位置。当找到一个叶子节点时,在队列中通过双亲节点的位置输出该叶子节点到根节点的逆路径。对应的算法如下:void AllPath(BTNode * b){struct snode{BTNode *no原创 2015-07-06 14:39:17 · 14384 阅读 · 1 评论 -
设计一个算法,判断给定的一棵二叉树是否是二叉排序树(二叉树的所有关键字均为正整数)
思想:对二叉排序树来说,其中序遍历序列为一个递增有序序列,因此,对给定的二叉树进行中序遍历,如果始终能保持前一个值比后一个值小,则说明该二叉树是一棵二叉排序树。算法如下:KeyType predt=0;//predt为全局变量,保存当前节点中序前趋的值,初值为最小值int judgeBST(BSTNode *bt){//返回1表示是一颗二叉排序树,返回0表示不是int b1原创 2015-07-09 17:12:42 · 13039 阅读 · 2 评论 -
设计一个算法,求非空二叉树中指定的第k层(k>1)的叶子节点的个数
思想:采用基于层序遍历的方法。用level扫描各层节点,若某一层的节点出队后,rear指向该层中最右节点,则将rear赋值给last(对于第一层,last=1).在出队时,若front=last,表示这一层处理完毕,让层号level增1,并置last为下一层最右节点。那么如何求一层的最右节点呢?这是因为第一层只有一个节点,它就是最右节点。对于其他层,上一层最右节点最后进队的孩子一定是该层的最右节点原创 2015-07-06 01:03:57 · 3744 阅读 · 0 评论 -
二叉树的遍历
所谓二叉树的遍历,就是按照某种次序访问二叉树中的每个节点,而且每个节点仅访问一次的过程。以L、N、R分别表示遍历左子树、访问根节点、遍历右子树,则可有NLR、LRN、NRL、RNL、RLN等6中遍历方式。若限定先左后右,则只有三种遍历,分别成为先序遍历、中序遍历和后序遍历,另外还有一种按层序的遍历方式。下面我们采用一个例子来完成的描述二叉树的遍历过程: 这是一个递归生成的二叉树,’原创 2017-04-05 14:46:22 · 1480 阅读 · 0 评论