![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
阿杜
这个作者很懒,什么都没留下…
展开
-
二叉树程序遍历---框架--应用
二叉树程序遍历也就那样学会二叉树的层序遍历框架。以下题目都可求解。102.二叉树的层序遍历107.二叉树的层次遍历II199.二叉树的右视图637.二叉树的层平均值429.N叉树的前序遍历515.在每个树行中找最大值116.填充每个节点的下一个右侧节点指针(等于117)117.填充每个节点的下一个右侧节点指针II102.二叉树的层序遍历层序遍历一个二叉树,就是从左到右一层一层的去遍历二叉树。需要借用一个辅助数据结构即队列来实现,队列先进先出,符合一层一层遍历的逻辑,而是用栈先进原创 2020-11-30 22:55:30 · 262 阅读 · 0 评论 -
只出现一次的数字----快速解法(数学)
只出现一次的数字----快速解法(1)首先我们的数学基本知识:0 ^ x = x;x ^ x = 00异或任何一个数为这个数本身,任何一个数异或自己等于0。(2)分析我们可以遍历一遍数组进行互相异或,出现相同次数的数字最后得0,只出现一次的数字最后异或得这个数本身,也就是答案。代码如下:class Solution{public: int singleNumber(vector<int> &nums){ int ans = 0; for(int i = 0原创 2020-11-15 17:49:35 · 258 阅读 · 0 评论 -
实现一个没有bug的宏----MAX
实现一个没有bug的宏----MAX分析:(1)首先可以先简写一个有bug的宏。(2)然后根据 gcc -E MAx.c 来进行判断bug(3)可以使用__typeof(a) _a = (a) 进行替换,这样的a++就不会在加了。gcc -E MAx.c 结果如图所示:代码如下:结果如下:...原创 2020-11-01 23:29:20 · 91 阅读 · 0 评论 -
二分查找实现自己的sqrt函数
二分查找实现自己的sqrt函数分析:1.二分查找适用于单调序列。2.求一个数的开平方,我们可以想象成从0到这个数进行查找 x*x = 这个数。代码如下/************************************************************************* > File Name: binary_search.c > Author: du > Mail: > Created Time: 2020年11月01日 星期日 01原创 2020-11-01 17:27:59 · 255 阅读 · 0 评论 -
链表解决一个稍有改动的“约瑟夫环(Josephus problem)”问题
链表解决一个稍有改动的“约瑟夫环(Josephus problem)”问题计算理工学院有 NN 个同学,围成了一个圆圈,每人被顺序地编了一个序号(分别为 1,2,3… n1,2,3…n),从编号为 KK 的人开始报 11,他之后(顺初始数字增长方向计算序号)的人报 22,以此类推,数到某一个数字 MM 的人出列。出列同学的下一个人又从 11 开始继续报数,数到某一个数字 MM 的人出列。不断重复这一过程,直到所有人都出列为止。你需要根据同学人数 NN 和给出的 KK 和 MM 计算出同学的正确出列顺序。原创 2020-10-12 15:27:53 · 210 阅读 · 0 评论 -
c/c++之栈的压入,弹出序列-------测试用例
c/c++之栈的压入,弹出序列-------测试用例// 题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是// 否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1、2、3、4、// 5是某栈的压栈序列,序列4、5、3、2、1是该压栈序列对应的一个弹出序列,但// 4、3、5、1、2就不可能是该压栈序列的弹出序列。分析:解决这个问题最直接的想法则是建立一个辅助栈。把输入的第一个序列中的数字一次压入该辅助栈,并按照第二个序列的顺序依次从从该栈中弹出数字。综上总结:原创 2020-09-06 10:56:17 · 242 阅读 · 0 评论 -
c/c++之对称的二叉树---测试用例
c/c++之对称的二叉树—测试用例// 题目:请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。分析:通常我们我们遍历树的算法为前序遍历,中序遍历,后序遍历。一般使用前序遍历(根左右)。如果我们定义一种先遍历根节点,然后遍历右节点,最后遍历左节点。如果前序遍历 == 新定义的遍历。那么则是对称。第一个树:前序遍历:{8,6,5,7,6,7,5},自定义遍历{8,6,5,7,6,7,5} 这两种遍历相等。说明是对称的。第二个树:前序遍历:{8,6,5,7,原创 2020-09-01 21:47:46 · 373 阅读 · 0 评论 -
c/c++之验证树的子结构-----测试用例
c/c++之验证树的子结构-----测试用例// 面试题26:树的子结构// 题目:输入两棵二叉树A和B,判断B是不是A的子结构。二叉树节点定义如下struct BinaryTreeNode{ double m_dbValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight;}如图A中一部分子树的结构和B树中一样,因此B是A树的子结构。分析:由图可以知道2步即可解决。(1)在树A中寻找和B树根节点的值一样的节点R。(2)判断树原创 2020-08-28 16:56:11 · 210 阅读 · 0 评论 -
c/c++之合并两个排序的链表++++测试用例
c/c++之合并两个排序的链表++++测试用例// 题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按// 照递增排序的。例如输入图3.11中的链表1和链表2,则合并之后的升序链表如链// 表3所示。分析:首先分析两个链表的合并过程。链表1的头结点的值小于链表2的头节点的值,因此链表1的头结点是合并后链表的头结点。然后继续合并两个链表中剩下的节点,两个链表中剩下的节点依旧是排序的,所以依旧比较头结点,此时链表2中的头结点小于链表1中的头结点,因此作为合并后链表的节点。依次类原创 2020-08-25 22:22:56 · 651 阅读 · 0 评论 -
c/c++反转链表---测试用例
c/c++反转链表—测试用例// 题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。分析:为了正确的反转链表,我们需要调整链表中指针的方向。我们需要定义三个指针,分别是当前遍到的节点,它的前一个节点,以及后一个节点。反转后链表的头结点即是原始链表的尾结点,自然是m_pNext为nullptr的节点ListNode *ReverseList(ListNode *pHead){ ListNode* pReversedHead = nullptr; ListNode*原创 2020-08-24 18:08:52 · 681 阅读 · 0 评论 -
查找链表中环的入口节点----测试用例
链表中环的入口几点题目:一个链表中包含环,如何找出环的入口结点?例如,在链表中, 环的入口结点是结点3。分析:(1)首先我们要确定链表是否有环,可以考虑使用双指针来确定。定义两个指针,同时从链表的头部出发,第一个指针走一步,第二个指针一次走二步。如果走的快的指针追上了走的慢的指针,那么就证明链表有环。如果走的快的指针走到了链表的末尾(m_pnext指向NULL)都没有追上第一个指针,那么表示无环。(2)找到环的入口。还是可以用2个指针来解决问题。先定义两个指针p1和p2指向链表的头结点,。如果链表环中原创 2020-08-22 17:08:03 · 206 阅读 · 0 评论 -
输出链表中倒数第k个节点----鲁棒性分析
链表中倒数的k个节点// 题目:输入一个链表,输出该链表中倒数第k个结点。为了符合大多数人的习惯,// 本题从1开始计数,即链表的尾结点是倒数第1个结点。例如一个链表有6个结点,// 从头结点开始它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个结点是// 值为4的结点。链表节点定义如下struct ListNode{ int m_nValue; ListNode* m_pNext;};分析:为了得到倒数第k个节点,很自然的想法就是先走到链表的尾端,再从尾端回溯k步。可是从定义原创 2020-08-21 17:41:27 · 123 阅读 · 0 评论 -
C语言之数值的整数次方--不能使用库函数
数值的整数次方题目:实现函数double Power(double base, int exponent),求base的exponent次方。不可以使用库函数,同时不需要考虑大数问题。#include <stdio.h>#include <stdlib.h>#include <math.h>#include <stdbool.h>double absPower(double base, int exponent);bool InVailed原创 2020-08-18 16:47:48 · 602 阅读 · 0 评论 -
求旋转数组的最小数字---代码+测试用例
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组 {3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。原创 2020-08-15 17:36:08 · 181 阅读 · 0 评论 -
两个栈stack1和stack2来实现队列queue
两个栈实现队列题目:用两个栈实现一个队列。队列申明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入节点和在队列头部删除节点的功能。template<typename T>class CQueue{public: CQueue(void); ~CQueue(void); void appendTail(const T& node); T deleteHead();private: std::stack<T> st原创 2020-08-08 17:39:11 · 361 阅读 · 0 评论