![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Data Strutures and Algorithm
日常作业随笔
fengranmo
学习路上的算法菜鸟,准留学党,NLP学子
展开
-
二叉树的最近公共祖先
题意:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”思路:从根递归遍历,1.如果根为空,返回空。2.如果根不空,则如果p或q等于根,返回根。3.如果p或q不为根,则遍历左右子树,如果左子树为空,则返回右子树,如果右子树为空,则返回左子树,如果都不空,则返回根,如果都空,则返回空。Tr..原创 2020-05-20 15:25:52 · 156 阅读 · 0 评论 -
二叉树的层序遍历
使用队列维护,时间复杂度O(n),可解决右视图问题vector<int> level(TreeNode* root) { if(root == NULL) return {}; vector<int> ans; queue<TreeNode*> q; q.push_back(root); while(!q.empty()) { int len = q.size(); for(int i=0; i&l原创 2020-05-19 20:21:28 · 200 阅读 · 0 评论 -
数组元素循环右移 (Element in array moves to the right circularly)
问题描述: 将存有n(n>0)个数的数组A中的元素A[0]至A[n-1]循环右 移k(k>0)位。算法描述:例如,1234567向右移动3位为5671234,则可将1234567按k分为1234和567两段,先将1234和567分别逆置为4321765,再将数组统一逆置,结果为5671234. 时间复杂度为O(n).代码如下:#include<iostream>#incl...原创 2018-04-17 22:45:52 · 250 阅读 · 0 评论 -
求矩阵马鞍点 (Get matrix's saddle point)
问题描述:求一个n*m阶矩阵的马鞍点马鞍点定义:在一个矩阵中,若一个元素为该行最小值,该列最大值,则称该元素为这个矩阵的一个马鞍点如:0 1 2 1 0 则马鞍点为a[1][0]和a[1][4] 1 2 3 2 1 代码如下:#include<iostream>#include<cstdio>#include<cstring>#defi...原创 2018-04-16 23:20:41 · 2023 阅读 · 0 评论 -
完全二叉树判断 (Judge Complete BiTree)
问题描述:采用二叉链表存储表示,设计算法判断一个二叉树是否为完全二叉树。解题思路:1、如果树为空,则直接返回否。2、如果树不为空:层序遍历二叉树 。2.1、如果一个结点左右孩子都不为空,则pop该节点,将其左右孩子入队列; 2.1、如果遇到一个结点,左孩子为空,右孩子不为空,则该树一定不是完全二叉树; 2.2、如果遇到一个结点,左孩子不为空,右孩子为空;或者左右孩子都为空;则该节点之后的队列中的结...原创 2018-05-23 14:55:12 · 532 阅读 · 0 评论 -
普里姆算法求最小生成树(MST-Prim algorithm)
最小生成树:带权图的生成树上的各边权 值之和称为这棵树的代价。最小代价生成 树是各边权值的总和最小的生成树。普里姆算法(Prim)步骤:1、选取源点作为最小生成树的结点,并初始化当前与生成树相连的最好情况,即权值最小的边2、选取权值最小的边加入生成树,并更新各顶点的最好情况。3、重复步骤2,直到所有顶点都加入生成树当中。代码如下:#include<stdio.h>#include&l...原创 2018-05-23 11:11:30 · 2875 阅读 · 0 评论 -
二叉树操作(1) 建立与递归遍历
本文主要介绍二叉树的基本操作——先序建立、先序递归遍历、中序递归遍历、层次递归遍历代码如下:#include<cstdio>#include<cstring>#include<iostream>#define MAX 100using namespace std;typedef struct BiTNode{ char data; struct...原创 2018-04-21 23:24:53 · 284 阅读 · 0 评论 -
使用循环队列求K阶斐波拉契数列 (Sum K order Fibonacci Numbers base on round-robin queue)
问题描述:用循环队列编写求k阶斐波那契序列中前n+1项(f1,f2,…,fn)的算法 ,要求满足fn<max,而fn+1>max, max为某个约定的常数,注意 :本题所用循环队列的容量为k,算法结束时,留在队列中的元 素为所求k阶斐波那契序列中的最后k项。K阶斐波拉契数列定义:前K-1项为0,第K项为1,从第K+1项起该项为前K项的和。算法描述:1、先将循环队列初始化,即从队首元素到...原创 2018-04-17 22:59:02 · 1351 阅读 · 0 评论 -
三元组实现稀疏矩阵的压缩存储与转置 (Sparse matrix compression storage and transposition base on triple)
问题描述:用三元组压缩储存一个row行,col列稀疏矩阵的非0元,并实现转置功能PS:本文使用了两种不同算法实现稀疏矩阵的转置与存储功能,复杂度分别为O(A.mu*A.nu) 和 O(A.nu+A.tu)步骤:利用数组和结构体建立三元组->输入稀疏矩阵的值->用三元组A保存非0元算法1:扫描col次旧三元组A,依次将列号为"1,2....col"的非零元行列号交换后存放到新三元组B中...原创 2018-04-02 23:58:19 · 779 阅读 · 0 评论 -
回文模式识别 (Palindrome Identify)
问题描述:判断所输入的以‘@’为结束标记的 字符串是否形如“序列1&序列2”的形式,其中序列1和 序列2都不含‘&’字符,序列1是序列2的逆序列,比如 “a+b&b+a@”就是一个属于该模式的字符串,而 “a+b&b-a@”则不是。PS:共使用三种方式判断,各有优劣代码如下:#include<cstdio>#include<iostream>...原创 2018-03-26 18:36:14 · 346 阅读 · 0 评论 -
用链表实现带菜单功能的一元多项式的基本操作 (Use linked list to realize the basic operation of a one-dimensional polynom)
问题描述:从键盘读入一元多项式中每一项的系数和指数,编写算法和建立文本菜单实现: 建立带表头结点的单链表存放一元多项式(按照指数升序排列); 输出一元多项式的所有数据元素(按照指数升序输出每一系数非0项的系数和指数); 将单链表存放的一元多项式就地逆置,变成按照指数降序排列; 输入自变量的值,计算一元多项式的值(设计高效算法); 求2个一元多项式的和多项式;程序使用说明:1. ...原创 2018-03-31 23:44:48 · 1488 阅读 · 0 评论 -
用单链表实现运算 A-(B∩C) (Set operation A-(B∩C) base on linklist)
问题描述:3个递增有序的单链表A,B,C,在A表中删除同时出现在B和C中的数据元素算法时间复杂度:O(n)代码如下:#include<stdio.h>#include<malloc.h>#include<iostream>typedef struct Node{ int data; struct Node *next;}node, *LinkLis...原创 2018-03-31 22:07:33 · 244 阅读 · 0 评论 -
用栈实现成对括号检查 (Check bracket base on Stack)
问题描述:从左至右读取表达式,读到运算对象和运算符,不做任何动作,直接往下继续读,读到括号,要对括号的使用是否正确进行检查。如: {[ ]( [ ][ ])} 为合法代码如下:#include<cstdio>#include<iostream>#include<cstring>#define MAXSIZE 20typedef struct Se...原创 2018-03-25 23:23:33 · 508 阅读 · 0 评论 -
用栈实现逆波兰式转换 (ReversePolishNotation base on Stack)
问题描述:将由+,-,*,/, (, )和单字母变量组成的普通表达式转换成逆波兰式。逆波兰式示例:a+b → ab+ a+b*c → abc*+ a+b*c-e → abc*+e-PS:输入为'#'是结束标志代码如下:#include<cstdio>#include<ios...原创 2018-03-25 23:13:19 · 1512 阅读 · 0 评论