先序遍历

高级PHP面试总结

故事扮演 提交于 2019-11-30 02:41:47
1、给你四个坐标点,判断它们能不能组成一个矩形,如判断([0,0],[0,1],[1,1],[1,0])能组成一个矩形。 勾股定理,矩形是对角线相等的四边形。只要任意三点不在一条直线上,任选一点,求这一点到另外三点的长度的平方,两个短的之和如果等于最长的,那么这就是矩形。 2、写一段代码判断单向链表中有没有形成环,如果形成环,请找出环的入口处,即P点 /* *单链表的结点类 */ class LNode{ //为了简化访问单链表,结点中的数据项的访问权限都设为public public int data; public LNode next; } class LinkListUtli { //当单链表中没有环时返回null,有环时返回环的入口结点 public static LNode searchEntranceNode(LNode L) { LNode slow=L;//p表示从头结点开始每次往后走一步的指针 LNode fast=L;//q表示从头结点开始每次往后走两步的指针 while(fast !=null && fast.next !=null) { if(slow==fast) break;//p与q相等,单链表有环 slow=slow.next; fast=fast.next.next; } if(fast==null || fast.next==null)

javascript实现二叉搜索树

≡放荡痞女 提交于 2019-11-30 01:38:36
在使用javascript实现基本的数据结构中,练习了好几周,对基本的数据结构如 栈、队列、链表、集合、哈希表、树、图等内容进行了总结并且写了笔记和代码。 在 github中可以看到 点击查看 ,可以关注一下我哈。 树的基本术语 二叉树节点的存储结构 创建一个二叉搜索树 二叉树的先序、中序、后续遍历算法 二叉树的非递归先序、中序、后续遍历算法 。 文章对树了解的不多的人有点不友好,这里简单介绍(从书上抄下来)那些基本的一点概念吧。 看下面这个示意图 树的基本术语: 结点: A、B、C等都是结点,结点不仅包含数据元素,而且包含指向子树的分支。例如,A结点不仅包含数据元素A、还包含3个指向子树的指针。 结点的度: 结点拥有的子树个数或者分支的个数,例如A结点有3棵子树,所以A结点的度为3. 树的度: 树中各结点度的最大值。如例子中结点度最大为3(A、D结点)。最小为0(F、G、I、J、K、L、M),所以树的度为3。 叶子节点 :又叫做 终端节点, 指度为0的节点,F、G、I、J、K、L、M节点都是叶子节点。 孩子: 结点的子树的根,如A节点的孩子为B、C、D。 双亲: 与孩子的定义对应,如B C D结点的双亲都是A。 兄弟: 同一个双亲的孩子之间互为兄弟。如B、C、D互为兄弟,因为它们都是A节点的孩子。 祖先 :从根到某节点的路径上的所有结点,都是这个节点的祖先。如K的祖先是A B E

二叉树遍历实现及效率分析

主宰稳场 提交于 2019-11-30 01:07:33
1 理论 1、二叉树遍历方法 先序遍历遍历顺序:根–左--右 中序遍历遍历顺序:左–根--右 后序遍历遍历顺序:左–右--根 层序遍历遍历顺序:从上到下,从左到右 2、二叉树复原 已知 先序遍历序列 和 中序遍历序列 ,可以唯一确定一颗二叉树 已知 中序遍历序列 和 后序遍历序列 ,可以唯一确定一颗二叉树 已知 先序遍历序列 和 后序遍历序列 , 不 能唯一确定一颗二叉树 3、二叉树存储 顺序存储:用一维数组存储二叉树中的节点,并且节点的存储位置,也就是数组的下标要能体现节点之间的逻辑关系,一般只用于完全二叉树 。 链式存储:每个节点的结构具有一个存储数据的变量与两个指向孩子的指针域。 2 代码 #include <iostream> #include <vector> #include <stack> #include <queue> #include <ctime> using namespace std; struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; #pragma region 先序遍历 void preorderRecursion(TreeNode* node) { if (node) {

已知二叉树先序遍历中序遍历求其后序遍历、重建二叉树

妖精的绣舞 提交于 2019-11-29 19:31:06
已知二叉树先序遍历中序遍历求其后序遍历 (注:已知中序遍历序列和剩下两种遍历序列中的一种都可以确定二叉树,即可得到另一种遍历序列, 但是已知前序遍历和后序遍历序列并不能唯一确定二叉树,例如:preorder:AB postorder:BA,我们不能确定B是A的左子还是右子。) 二叉树的先序遍历的第一个元素总是树的根结点,而在中序遍历中,根结点在序列的中间,其左右两边分别是根结点的左右子树。 因此我们可以根据先序遍历确定根结点,然后在中序遍历中扫描根结点,同时可得到左右子树的中序遍历和先序遍历,递归此过程,即可获得二叉树的所有结点。 而后序遍历即为根结点左子树的后序遍历+右子树的后序遍历+根结点。 递归实现思路非常简单,C++代码: string getpostorder(char* preorder, char* inorder, int length){ string str = ""; char* rootInorder; //根结点在中序遍历中的位置 int leftlength; //左子树长度 if (length <= 0||preorder==NULL||inorder==NULL)//递归边界条件 return ""; else{ leftlength = 0; rootInorder = inorder; //扫描根结点 while (leftlength <

二叉树的遍历

戏子无情 提交于 2019-11-29 18:36:30
一般的数据结构都有遍历操作,根据需求的不同,二叉树一般有四种遍历方式: 1、先序遍历 如果二叉树为空,遍历结束,否则,第一步,访问根节点;第二步,先序遍历根节点的左子树,第三部,先序遍历根节点的右子树。 2、中序遍历 如果二叉树为空,遍历结束,否则,第一步,中序遍历根节点的左子树;第二步,访问根节点,第三部,中序遍历根节点的右子树。 3、后序遍历 如果二叉树为空,遍历结束,否则,第一步,后序遍历根节点的左子树;第二步,后序遍历根节点的右子树,第三部,访问根节点。 4、层次遍历 从二叉树的第一层(根结点)开始,从上至下逐层遍历,在同一层,则按从左到右的顺序对结点逐个访问。 通过上面的理论可以总结出先序遍历和中序遍历来求解二叉树的过程,步骤如下: a)确定树的根节点。树根是当前树中所有元素在先序遍历中最先出现的元素,即先序遍历的第一个结点就是二叉树的根。 b)求解树的子树。找到根在中序遍历的位置,位置左边是二叉树的左孩子,位置右边是二叉树的右子树,如果根节点左边或右边为空,那么该方向子树为空;如果根节点左边和右边都为空,那么根节点已经为叶子节点。 c)对二叉树的左、右孩子分别进行步骤a)、b),直到求出二叉树结构为止。 来源: https://www.cnblogs.com/yazhong-java/p/11526318.html

python实现基础的数据结构(二)

非 Y 不嫁゛ 提交于 2019-11-29 18:33:55
本文涉及到的代码均已放置在我的github中 --> 链接 python实现基础的数据结构(一) python实现基础的数据结构(二) python实现基础的数据结构(三) python语法较为简洁,正好最近在复习数据结构,索性就用python去实现吧😀 本文实现的有线性表、栈、队列、串、二叉树、图、排序算法。参照教材为 数据结构(C语言版)清华大学出版社 ,还有网上的一些大神的见解。由于包含代码在内,所以内容很多,分了几篇,话不多说,我们直接步入正题🙈 注:本文实验环境:Anaconda 集成 python 3.6.5 ( 故代码为 python3 ) 由于本文代码过多,故每一步不做太详细的介绍,我尽量在代码中解释细节,望体谅 串 串是由零个或者多个字符组成的优先序列,一般记为是s = ‘a1a2…an’ ,python对字符串的操作已经比较成熟和简单,所以我们这里着重介绍串的模式匹配算法,这就不得不提KMP匹配算法,这种算法和正则表达式有类似之处,一个用了DFA的思想,一个用了NFA的思想。 KMP算法的思想是,当匹配失败时,可以利用已经知晓的一部分文本内容,避免从头开始重新匹配。这个匹配的过程可以使用有限状态自动机(DFA)。可以看看 这位大神 的描述。 每当一趟匹配过程中出现字符比较不等时,不需要回溯I指针,而是利用已经的带的“部分匹配

树、图、排序查找重要算法(960算法)

老子叫甜甜 提交于 2019-11-29 17:09:09
设计求T的WPL的算法:   (1) .给出二叉树结点的数据类型定义;   (2) .给出C语言描述算法;   【 1 】: typedef struct node { int weight; struct node *left,*right; //指向结点左右子女的指针 }BiNode,*BiTree;   【 2 】: int WPL=0; void inorder(BiTree bt,level lv) //bt是二叉树,lv是结点的层次,初值为1 { if(bt) {inorder (bt->left,lv+1); //中序遍历左子树 if(bt->left==null &&bt->right==null) //判断该结点是否为叶子 WPL+=(lv-1)*bt->weight; //累加结点带权路径长度 inorder(bt->right,lv+1); } } 【先序遍历】 NLR (递归) void PreOrder(BiTree T){ if(T!=NULL){ visit(T); //访问根结点 PreOrder(T->lchild); //递归遍历左子树 preOrder(T->rchild); } } 【中序遍历】 LNR (递归) void InOrder(BiTree T){ if(T!=NULL){ InOrder(T->lchild); visit(T)

二叉树算法题

断了今生、忘了曾经 提交于 2019-11-29 15:20:30
二叉树层次遍历 //思路 特殊情况 ,根节点为null,深度为0,return 0 借助队列,队列储存每一层的所有节点, 先保存数组长度,用于控制依次遍历循环——遍历每一个节点保存值,该节点的所有子结点从队尾入队,访问过的节点从头出队 注意——需要先把width存下来,用于for循环的结束标志,因为for循环里面直接操作了queue,不能去都不敢动态获取 队列初始值为root,对每一层都要进行上述遍历——while循环控制,队列空代表叶节点这一层遍历完成,此时遍历结束,退出循环 每次循环开始前初始化一个curNodes储存该层所有节点,每次循环结束,将curNodes压入result var levelOrder = function(root) { if (root === null) return []; //空树 var result = [], queue = [root]; while (queue.length) { let width = queue.length; //需要先把width存下来,用于for循环,for循环里面直接操作了数组 let curNodes = []; for (let i = 0; i < width; i++) { let node = queue.shift(); curNodes.push(node.val); node.left ?

数据结构(四)二叉树

半城伤御伤魂 提交于 2019-11-29 12:29:17
一、树 Vector和List都有明显的弱点,都无法兼顾动态和静态操作的高效性。 Tree可以认为将Vector和List的优点结合了起来,可以认为是列表的列表List<List>,半线性结构。 应用 层次关系的表示 从数学上看,树是一类特殊的图,联通无环图。 树由一组顶点(vertex)以及连接于期间的若干条边(edge)组成。 在计算机科学中 ,会指定某个特定的顶点,称之为根(root) 在指定了根之后,我们称该树为 有根树(rooted tree) 从程序实现的角度,我更多地将顶点(vertex)称作节点(node) 通过彼此嵌套,小型的有根树可以变成大型的有根树 对于任何一组有根树,可以通过引入新的顶点,在新的顶点和此前各有根树的树根之间引入对应的一条连边,从而构成规模更大的一棵有根树。 r i 称作r的孩子(child),r i 之间互称 兄弟(sibling) ,r为其 父亲(parent) d=degree(r)为r的(出) 度 (degree) 某一节点v孩子的总数,称作该节点的度数或度(degree),无孩子的节点称为叶节点(leaf node),包括根在内的其余节点皆为内部节点(internal node)。 n为顶点数,e为边数, 任何一棵树所含的边数,恰好等于所有顶点的度数之和,也等于顶点总数减1,一棵树的边数与顶点数目是同阶的。 树是 无环连通图

二叉树的遍历

那年仲夏 提交于 2019-11-29 11:10:28
目录 一、二叉树的遍历 1.1 先序遍历 1.2 中序遍历 1.3 后序遍历 1.4 小结 二、二叉树的非递归遍历 2.1 中序遍历非递归遍历算法 2.2 先序遍历的非递归遍历算法 三、层序遍历 3.1 队列实现 四、实际应用 4.1 遍历二叉树的应用:输出二叉树中的叶子节点 4.2 求二叉树的高度 4.3 二元运算表达式树及其遍历 4.4 由两种遍历序列确定二叉树 一、二叉树的遍历 1.1 先序遍历 遍历过程为: 访问 根结点 先序 遍历其左子树; 先序 遍历其右子树。 /* c语言实现 */ void PreOrderTraversal (BinTree BT) { if (BT) { printf("%d", BT->Data); PreOrderTraversal(BT->Left); PreOrderTraversal(BT->Right); } } 先序遍历: A (B D F E)(C G H I) 1.2 中序遍历 遍历过程为: 中序 遍历其 左子树 ; 访问 根节点 ; 中序 遍历其 右子树 。 /* c语言实现 */ void InOrderTraversal (BinTree BT) { if (BT) { InOrderTraversal(BT->Left); printf("%d", BT->Data); InOrderTracersal(BT-