- 博客(38)
- 收藏
- 关注
原创 求二叉树中两个节点的最近公共祖先(三叉链,搜索树,普通二叉树)
求二叉树中两个节点的最近公共祖先。要求:分别考虑以下三种情况 1、二叉树每个节点有parent(三叉链) 2、二叉树是搜索二叉树。 3、就是普通二叉树。(尽可能实现时间复杂度为O(N)) 节点:struct Node{ int _data; Node* _left; Node* _right; Node* _
2017-08-09 19:58:27
715
原创 判断一棵树是否是完全二叉树
完全二叉树概念 若设二叉树的深度为h,除第h 层外,其它各层(1~h-1) 的结点数都达到最大个数,第h 层所有的结点都连续集中在最左边,这就是完全二叉树 思路 :利用队列queue实现(层序遍历思想) 1、如果树为空,则直接返回false 2、如果树不为空:层序遍历二叉树 (1)如果一个结点左右孩子都不为空,则pop该节点
2017-08-03 18:58:12
764
原创 判断一个节点是否在二叉树中,判断tree2是否为tree1的子树
1、判断一个节点是否在一棵二叉树中。 先判断根节点,递归判断左子树,递归判断右子树。2、判断一颗二叉树是是否是另一颗树的子树。比如tree2是tree1的子树。 先判断根,根相同再判断左右子树如果所有的都相同,则此树是另一个树的子树。 如果只有根相同,则向下继续找和跟相同的结点。代码:#include<iostream>using namespace std;struct
2017-08-01 22:50:55
1572
原创 【基础题】--实现二叉树的前序 / 中序 / 后序非递归遍历
二叉树的递归遍历,我们知道是很简单的,而非递归遍历则需要利用栈的先进后出特性来实现。1、前序非递归遍历 利用双重循环,内部循环将左孩子要入栈中直到左孩子为空,并且压一个输出一个数据,再判断栈顶的右孩子。若右孩子不为空,则再循环将其压入栈中,若右孩子为空,则pop栈顶数据。直到栈为空,遍历完成。2、中序非递归遍历 中序遍历与前序遍历是异曲同工的,只是应先将左孩子全部压入栈中
2017-08-01 22:37:14
404
原创 shell脚本--命令替换``(反引号)与$()的区别与联系
命令替换就是指shell能够将一个命令的标准输出插在一个命令行中任何位置。本文介绍两种命令替换:``和$()者两种命令的功能是相同的,在执行一条命令是,会将``或者$()中的语句当做命令执行以便,再把结果加入到原命令中重新执行。但是两者也有其不同点。比如编写以下脚本运行,两者的运行结果就不相同#!/bin/bashecho `echo \$HOSTNAME`echo $(echo
2017-07-15 17:02:33
941
原创 shell脚本--字符串的截取【面试题】
题目文件内容如下: 123abc456 456def123 567abc789 789def567要求输出: 456ABC123 123DEF456 789ABC567 567DEF789解答代码#!/bin/bashwhile read line #实现touch一个文件file,从file中一行一
2017-07-15 11:25:57
381
原创 shell脚本--实现彩色进度条
先看代码吧!!/bin/bashi=0str=''label=('|' '/' '-' '\\') #在进度条末尾出现旋转线条while [ $i -le 100 ]do let index=i%4 let color=30+i%8 # 30表示黑色,%8为了实现让进度条在8种颜色中闪烁进行
2017-07-15 11:03:04
364
原创 基于单链表和环形队列的生产者-消费者模型
背景 某个模块负责产生数据,而这些数据由另一个模块来负责处理。那么产生数据的模块就称为生产者,处理数据的模块就称为消费者。 单单有生产者和消费者还不能称为生产者-消费者模型,我们还需要一个交易的场所(缓冲区),用自己的话总结来说,生产者-消费者模型可以称为“三二一原则”: “三”指三种关系,1)生产者与生产者之间为互斥关系;
2017-07-13 16:02:35
461
原创 URG和PSH的区别及联系
TCP协议头部一共有六个控制位:其中包括URG、ACK、PSH、RST、SYN、FIN. <1>紧急URG紧急指针,告诉接受TCP模块紧要指针域指着紧要数据; <2>推送PSH置1时请求的数据段在接收方得到后就可直接送达应用程序,而不必等到缓冲区满时才发送; <3>复位RST置1时重新连接。如果接收到RST位,通常发生了某些错误; <4
2017-07-11 16:58:09
650
原创 套接字(socket)编程简单实现server-client聊天程序
1、socket 在TCP/IP协议中,一个IP地址标识网络通讯中唯一一台主机,而一个IP地址+一个TCP(或UDP)端口号就可以标识网络通讯中的一个进程,此时的IP地址+端口号即称为socket。 内存中的多字节数据相对于内存地址有大小端之分,磁盘文件中的多字节数据相对于文件中的偏移地址也有大小端之分,网络数据流同样也有大小端之分:先发出的数据是低地址,后发出的数据是搞地质
2017-07-11 15:31:52
7251
原创 网络基础随堂笔记
1、OSI七层模型 OSI将网络从逻辑上分为了七层,其主要目的是为解决异种网络互连时所遇到的兼容性问题,主要功能是帮助不同类型的主机实现数据传输。但OSI七层协议体系结构既复杂有不实用。所以我们主要分析TCP/IP四层(或五层)模型。2、TCP/IP四层(或五层)模型 TCP/IP是一组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇。其实四层模型分为五层,只是第一层物理层偏于硬件,于是
2017-07-11 14:46:35
361
原创 常见端口号及其分类
1、端口号 端口包括物理端口和逻辑端口。物理端口是用于连接物理设备之间的接口,如ADSL Modem、集线器、交换机、路由器上用于连接其他网络设备的接口。逻辑端口是逻辑上用于区分服务的端口,如TCP/IP协议。 一个IP地址的端口通过16bit进行编号,最多可以有65536个端口。端口是通过端口号来标记的,端口号只有整数,范围是从0到65535。 2、端口号的使
2017-06-29 16:41:02
12275
1
原创 NAT技术与代理服务器简单介绍
1、NAT技术(Network Address Translation) NAT网络地址转换用于将访问Internet上私有IP地址转换为合法的公有IP地址。其目的是延长IPV4的使用时间。 NAT技术以少量的公有IP地址代替大多的私有IP地址访问的方式,有助于减缓IP地址不足的问题,同时能有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。 NAT服务器有内部和
2017-06-29 16:12:41
543
1
原创 CRC冗余校验码
1、基本概念 CRC(Cyclic Redundancy Check)是数据通信领域中最常用的一种查错校验码,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行相似的算法以保证数据传输的正确性与完整性。 2、基本原理 这里先介绍“模2除法”的知识,与“算数除法”类似,只不过“模2除法“既不向上借位,也不比较除数
2017-06-29 15:04:31
1105
原创 vim的使用及其简单配置
vim的使用及简单配置本文讨论vim的三种模式,命令行模式(command mode)、插入模式(insert mod)、底行命令模式(last line mode)。命令行模式:控制屏幕光标的移动、字符、字或行的删除,移动复制某区段及进入其他两种模式。插入模式:只有在插入模式下才可以输入文字,按ESC键即可进入命令行模式底行命令模式:保存文件,退出vim编辑,设置编辑环境等功能。
2017-06-28 16:33:39
373
原创 守护进程
守护进程在介绍守护进程之前应该先了解进程组、作业、会话和终端的概念。1、进程组:一个或多个进程的集合。每个进程除了有一个进程ID外还属于一个进程组。每个进程组有一个组长进程,组长进程ID即为进程组ID,组长进程可以创建一个进程组,只要有一个进程存在则进程组就存在,与组长进程存不存在无关。2、作业:Shell分前后台控制的不是进程而是作业或者进程组。一个前、后台作业可以有多个进程组成。
2017-06-27 23:18:26
299
原创 堆(heap)
堆(heap)一、写在前面完全二叉树:若设二叉树的深度为h,出第h层外,其他各层(1~h-1)的节点数都达到最大个数,第h层所有的节点都连续集中在最左边。堆(heap)就是利用完全二叉树的结构来维护一组数据的数组。
2017-04-20 15:30:32
297
原创 线索二叉树(Threaded BinaryTree)
线索二叉树一、写在前面 本文主要介绍了中序线索化二叉树及中序线索化二叉树遍历。前序与后序原理相似,但在前、后序线索化二叉树中查找节点的后继较容易,而查找前驱要知道其双亲的信息,前、后序线索化二叉树是不完善的。 对于n个节点的二叉树,在二叉链存储结构中有n+1个空链域,利用这些空链域存放在某种遍历次序下该节点的前驱节点和后继节点的指针,这些指针称为线索,加上线索的二叉树称为线索二
2017-04-15 12:54:17
6323
2
原创 BinaryTree
BinaryTree一、介绍在前面 二叉树结构是学习数据结构的一大重点,是学习后面的搜索二叉树、AVL树、红黑树等的基础(后面会一一介绍)。 二叉树的应用也很多,比如可以帮助我们做排序的工作,提高查找数据的速度;二叉树基础的优化能不断优化我们系统的结构;在海量数据处理方面也有很大的运用,是优先级队列的雏形。 本文实现的是二叉树的一些基本操作:
2017-04-13 22:40:55
292
原创 数据结构 迷宫的非递归实现(回溯法)
迷宫的非递归实现(回溯法) 首先在项目工程所在文件夹下放入存有迷宫数据的文件Maze.txt,通过fopen("Maze.txt","r")读取文件中的数据,并进行转化。也可以在代码中直接定义一个二维数组来构建迷宫。 我们采用回溯法来取得迷宫的通路,我们从给出的入口(entry)出开始根据上、下、左、右的方向试探,若有通路,则将当前位置压入栈中
2017-03-18 16:31:03
3761
1
原创 Linux环境下文件权限的简单分析
Linux环境下文件权限的简单分析 最近学习了Linux环境下的一些基础知识,在这里浅谈一下Linux下目录、文件的管理权限。 在命令行输入ll回车可看见各个目录(or文件)的相关信息,除去一行开头的一位(文件的类型),向后数9位即是此文件的属性(0731/-rwx-wx--x)。 我们每三位为一组,第一组文件拥有者的权限(user—u),第二组为文
2017-03-14 19:51:53
768
原创 C++中对类和对象基础理解
C++中对类和对象基础理解C++不是纯面向对象的编程语言,而是基于面向对象的语言,因为C++中包含C语言的部分,而C语言是面向过程的。面向对象的三大特性:封装、继承、多态。封装:将方法和数据封装在类里面,可以根据访问限定符的使用保证数据的安全性,隐藏了方法的实现细节,也方便使用。继承:对已有类增加属性和功能或进行部分修改来建立新的类,是实现代码的复用的重要手段,
2017-03-04 17:41:28
6524
原创 简单实现动态顺序表
SeqList.h#pragma once#includetypedef int DataType;typedef struct SeqList{ DataType *arr; size_t size; size_t capicity;}SeqList;void InitSeqList(SeqList *seq);//初始化void DestorySeqList(SeqL
2016-12-05 20:23:58
325
原创 模拟实现通讯录(可变长)
contactlist.h#ifndef _CONTACT_#define _CONTACT_#include #include #include #include #include #include #define INIT_CAP 64#define INC_SIZE 128#pragma warning(disable:4996)typedef struc
2016-12-05 20:08:28
337
原创 C语言简单实现三子棋
首先我们在VS2013中建立一个test.c和game.c文件,再建立一个test.h头文件,其中game.c文件里面编写三子棋的主要功能实现,test.c文件用于三子棋功能测试,test.h文件用于声明函数。函数解释:memset(void *dest, intc, size_t count),dest为被设置对象,c为设置对象,count为设置数量例:memset(ar
2016-11-21 13:33:58
317
原创 模拟实现memmove
#include#include#include#pragma warning (disable:4996)void *my_memmove(void *dst, const void *src, int count){ assert(dst); assert(src); assert(count > 0); char *ret = dst; if (src >= dst
2016-11-15 12:47:20
295
原创 简单用函数指针数组和回调函数实现计算器
利用函数指针数组简单实现计算器函数指针数组:以char *(*p[3])(char *)为例解释,这是一个数组,数组名为p,数组内存储了3个指向函数的指针这些指针指向一些返回值类型为指向字符的指针、参数为一个指向字符的指针的函数#include#include#pragma warning (disable:4996)int add(int x, int y)//加法{
2016-11-13 20:55:08
1634
原创 C语言 宏和函数 个人对编译链接的理解
宏和函数:1、宏是简单的字符串替换,在引用宏的时候先用宏替换宏名,然后在编译。函数是编译之后执行时再调用。所以宏占用的是编译的时间,函数是占用的执行的时间。宏在编译之前进行,即先用宏体替换宏名,然后再编译。2、宏的参数不占内存空间,函数调用的时候参数是占用内存的,而宏函数太多太长时,调用就会使代码增长。3、宏的参数不受数据类型约束,函数参数传递时有数据类型的要求。4、函
2016-10-19 12:40:54
1291
原创 C语言 将一个整形数字二进制位进行奇偶交换
#include#define WOME(X)\ (((X&0x55555555)>1))//奇数位左移,偶数位右移int main(){ int ret = 5; scanf("%d", &ret); printf("%d %d\n", ret, WOME(ret)); system("pause"); return 0;}
2016-10-18 23:27:18
631
原创 C语言 __TIME__,__LINE__等的使用
#include#define WE\ //打印执行时间,行数,日期,文件位置 printf("%s\n %d\n %s\n %s\n",__TIME__,__LINE__,__DATE__,__FILE__)#define TRE "hello"#define TER "world"#define TRETER "bit"#define CAT(a,b) a##b //"##
2016-10-18 23:17:55
984
原创 C语言 打印菱形(可变行数)
#includeint main(){ int i = 0; int j = 0; int line = 0; printf("please enter the line:>"); scanf("%d",&line); for(i=1; i<=line; i++) { for(j=1; j<=line-i; j++) printf(" "); //printf("\
2016-10-05 17:37:40
7814
原创 C语言 猜数字游戏
#include#include#includeint main(){ int a = 1; while(1) { printf("******请选择******\n"); printf("******1.play******\n"); printf("******0.exit******\n"); scanf("%d\n",&a); switch(a)
2016-09-25 16:38:08
418
原创 C语言 1~100 所有整数中出现多少次数字 9
#includeint main(){ int i = 0; int count = 0; int a,b; for(i=1; i<100; i++) { a=i/10; b=i%10; if(a/3==3||b/3==3) { count++; } } printf("%d",count); return 0;}
2016-09-25 16:34:54
481
原创 C语言求100~200之间的素数
#include#includeint main(){ int m,i,a; int count = 0; for(m=101;m<=200;m=m+2) { a=1; for(i=2;i<=sqrt(m);i++) if(m%i==0) {a=0; break; } if(a==1) { printf("%d ",m);
2016-09-20 11:27:04
881
原创 C语言打印九九乘法表
#includeint main(){ int i,j; for(i=1;i<=9;i++) { for(j=1;j<=i;j++) { printf("%d*%d=%-2d ",i,j,i*j); if(i==j) printf("\n"); } } getchar(); return 0;}
2016-09-20 11:12:31
512
原创 不创建临时变量交换两个变量的内容
#includeint main(){ /*int a = 1; int b = 2;*/ int a = 0; int b = 0; scanf("%d,%d",&a,&b); a = a^b; b = a^b; a = a^b; printf("%d,%d",a,b); getchar(); return 0;}
2016-09-19 23:06:16
226
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人