查找和二叉树(基础知识和基本操作)

查找:

1.二分查找:先定一个大范围,想一个数,看是在起始范围到中间范围还是中间范围到结束范围,依次循环直到确定值(相当于一直把范围折半,直到找到)

while(low<=high)
{
    int mid=(low+high)/2
    
    if(key==arr[mid])//如果值就是范围的中间值就直接输出
    else if(key>arr[mid])
    {
       low=mid+1;     
    }
    else
    {
        high=mid-1;    
    }
}

哈希表:

散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。

散列函数:

直接定址法:取关键字或关键字的某个线性函数值为哈希地址的方法

数字分析法:通过分析取关键字的若干数位组成哈希地址的方法

平方取中法:取关键字平方后的中间几位数组成哈希地址的方法

除留余数法:取关键字被某个不大于哈希表表长m的数p除后所得余数为哈希地址的方法

H(key)=key MOD p (p<m)

哈希表表长m: 数组长度除以3/4

p:p一般取不大于表长m的最大质数 

随机数法:使用随机函数random构建哈希函数

哈希冲突

哈希冲突:不同关键字通过哈希函数映射在同一个存储位置

开放定址法:线性探测法、二次探测法、伪随机探测法

再哈希法、链地址法、建立公共溢出区

递归

1.直接递归:函数自己调用自己的方式

2.间接递归:多个函数之间相互调用

3,死递归:类似于死循环

4,递归:递归出口/递归边界 、递归前进段/递归公式

实现阶乘:

int rec(int n)
{
    if(n==0)
        return 1;
    else
        return n*rec(n-1);
}

实现斐波那契:

int Feiboncii(int n)
{
    if(n==1||n==2)
        return 2;
    else
        return Feiboncii(n-2)+Feiboncii(n-1);
}

树:

1>树:是由根结点和若干棵子树构成的树形结构

1.是n(n>=0)个结点的有限集,n>0时有且只有一个根结点,除根结点外,其余结点构成的互不相交的集合仍是一棵树

2> 空树:不含任何结点的树n=0

3>根结点:只有一个结点n=1

4> 普通树n>1: 多个结点

4.1有序树:有序树【从上到下,从左到右】是树中每棵子树从左到右排列有一定顺序,不能互换的树

4.2>无序树:无序树是树中每棵子树从左到右排列无顺序,能互换的树

4.3>子树:是树中一个结点以及其下面所有的结点构成的树

树的类型:

1>结点:树中的数据元素

2>结点的度:结点含有子树的个数

3> 根结点:没有双亲结点【前驱】的结点

4>分支结点(内部结点):是度不为0的结点

5>叶结点(终端结点):是度为0的结点

6>结点的层数:是从根结点到某结点所路径上的层数【根结点表示第一层】

7>树的深度(高度):是树中所有结点层数的最大值

8>树的度:各结点度的最大值

结点之间的关系

1>父结点:是指当前结点的直接上级结点

2>孩子结点:是指当前结点的直接下级结点

3>兄弟结点:是由相同父结点的结点

4>祖先结点:是当前结点的直接及间接上级结点

5>子孙结点:是当前结点直接及间接下级结点

6>堂兄弟结点:是父结点在同一层的结点

森林

森林:是指0个或多个互不相交树的集合

二叉树:

二叉树:树的度小于等于2

1>二叉树是每个结点最多有左、右两棵子树且严格区分顺序的树形结构【二叉树不可以互换】

2>二叉树的左边:左子树是以当前结点的左孩子结点作为根节点的子树

3>二叉树的右边:右子树是以当前结点的右孩子结点作为根节点的子树

 特殊形态:

1>空二叉树

2>只有一个根节点

3>只有左子树

4>只有右子树

5>既有左子树又有右子树

二叉树的类型

1>空二叉树:空二叉树是没有结点的二叉树

2>斜树:斜树是所有的结点都只有左子树或者都只有右子树的二叉树

2.1 左斜树:左斜树是所有的结点都只有左子树的斜树

2.2右斜树:右斜树是所有的结点都只有右子树的斜树

3>满二叉树:满二叉树是最后一层是叶子结点,其余结点度是2的二叉树

(1)叶子结点只能出现在最下面一层

(2)非叶子结点的度数一定是2

(3)同样深度的二叉树中,满二叉树的结点的个数最多,叶子结点最多

4>完全二叉树:完全二叉树是在一棵满二叉树基础上自左向右连续增加叶子结点得到的二叉树

(1)只有最后两层有叶子结点

(2)除最后一层是一棵满二叉树

(3)最后一层的叶子结点集中在左边连续的位置

二叉树的性质:

1.在非空二叉树的第i层上,至多有2^(i-1)个结点(i>=1)

2.在深度为K的二叉树上总结点最多有(2^k)-1个结点(k>=1)

3.在任意一棵二叉树中,叶子结点的数目比度数为2的结点的数目多1

4.

5.完全二叉树结点的编号方法是从上到下,从左到右根节点为1号结点设完全二叉树的结点数为n,某结点编号为I

若 i=1,则该结点是二叉树的根,无双亲,否则,其双亲结点是编号为 i/2的结点

若 2*i>n,则该结点无左孩子,否则,其左孩子结点是编号为 2i 的结点

若 2*i+1>n,则该结点无右孩子结点,否则,其右孩子结点是编号为2i+1 的结点

二叉树遍历

先序遍历:按照根左右的顺序

中序遍历:按照左根右的顺序

后序遍历:按照左右根的顺序

先序从前往后确定根,后序从后往前确定根,中序确定根左右的子树

二叉树创建:

Btree create_tree()
{
    datatypr e;
    scanf(" %c",&e);
    if(e=='#')
        return NULL;
    Btree tree=(Btree)malloc(sizeof(struct Node));
    if(tree==NULL)
        return NULL;
    tree->data=e;
    tree->lchild=create_tree();
    tree->rchild=create_tree();
    return tree;
}

先序/中序/后序遍历(依据跟的输出语句的位置)

先序(根左右):

void outout(Btree tree)
{
    if(tree==NULL)
    return;
    printf("%c\t",tree->data);//先进来输出节点的值
    output(tree->lchild);//用递归一直输出左孩子的左孩子,直到NULL,执行下一语句;
    output(tree->rchild);//接着上一句语句,输出右孩子,如果是NULL,则返回上一节点;
}
    

中序(左根右):

void outout(Btree tree)
{
    if(tree==NULL)
    return;
    output(tree->lchild);//用递归一直输出左孩子的左孩子,直到NULL,执行下一语句;
    printf("%c\t",tree->data);//先进来输出节点的值
    output(tree->rchild);//接着上一句语句,输出右孩子,如果是NULL,则返回上一节点;
}
  

 后序(左右根)

void outout(Btree tree)
{
    if(tree==NULL)
    return;
    output(tree->lchild);//用递归一直输出左孩子的左孩子,直到NULL,执行下一语句;
    output(tree->rchild);//接着上一句语句,输出右孩子,如果是NULL,则返回上一节点;
    printf("%c\t",tree->data);//输出节点的值
}
  

计算节点个数(0度的节点n0,1度的节点n1,和2度的节点n2)

void Count(Btree tree,int *n0,int *n1,int *n2)
{
    if(tree==NULL)
    return;
    
    if(tree->lchild==NULL && tree->rchild==NULL)
    (*n0)++;//没有子树的度为0的节点个数
    else if(tree->lchild!=NULL && tree->rchild!=NULL)
    (*n2)++;//有两个子树的度为2的节点个数
    else
    (*n1)++;//只有一个子树的度为1的节点个数
    Count(tree->lchild,n0,n1,n2);
    Count(tree->rchild,n0,n1,n2);
}

计算树的深度:

int High(Btree tree)
{
    if(tree==NULL)
        return 0;

    int left=High(tree->lchild)+1;//左子树深度
    int right=High(tree->rchild)+1;//右子树深度
    return left>right?left:right;//只算最深的子树深度
}

释放二叉树:

void free_space(Btree tree)
{
    if(tree==NULL)
        return ;

    free_space(tree->lchild);
    free_space(tree->rchild);
    free(tree);
    tree=NULL;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/43513.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

分布式光伏电站运维平台在石化行业的应用光伏发电数据实时监控

摘要&#xff1a;为实现绿色发展和“净零排放”的目标&#xff0c;近些年来国内外不少能源化工企业进入光伏发电领域。如何做好光伏电站的运行维护&#xff0c;成为石化企业不得不思考的重要课题。本文从分布式光伏电站消防安全、作业安全、环保管理等方面进行思考&#xff0c;…

为什么学习SpringSpring框架核心与设计思想(IOC与DI)?

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: JavaEE进阶 目录 文章目录 一、Spring是什么&#xff1f; 二、为什么要学习框架&#xff1f; 三、Spring核心概念 3.1 什么是容器&#xff1f; 3.2 什么是IOC&#xff1f; 四、再谈Spring中的 IOC 五…

mac如何提取视频中的音频?

mac如何提取视频中的音频&#xff1f;我们经常在平时工作的时候&#xff0c;需要将一个视频里面的音频单独提取出来另做他用&#xff0c;例如很多视频自媒体博主就经常使用这种方法来储备音频素材&#xff0c;这个操作在Windows上面比较容易实现&#xff0c;毕竟有相当多的软件…

计算机网络微课堂学习笔记(详细图解讲解)-长期更新

前言&#xff1a; 计算机网络在信息时代的作用 计算机网络已由一种通信基础设施发展成为一种重要的信息服务基础设施&#xff0c;计算机网络已经像水、电、煤气这些基础设施一样&#xff0c;成为我们生活中不可或缺的一部分 一、因特网概述 &#xff08;1&#xff09;网络、…

黑马 pink h5+css3+移动端前端

网页概念 网页是网站的一页,网页有很多元素组成,包括视频图片文字视频链接等等,以.htm和.html后缀结尾,俗称html文件 HTML 超文本标记语言,描述网页语言,不是编程语言,是标记语言,有标签组成 超文本指的是不光文本,还有图片视频等等标签 常用浏览器 firefox google safari…

Git标签管理(对版本打标签,起别名)

tag 理解标签创建标签git tag [name]git show [tagname] 操作标签删除标签git tag -d < tagname > 推送某个标签到远程git push origin < tagname > 理解标签 标签 tag &#xff0c;可以简单的理解为是对某次 commit 的⼀个标识&#xff0c;相当于起了⼀个别名。 …

实际上手体验maven面对冲突Jar包的加载规则 | 京东云技术团队

一、问题背景 相信大家在日常的开发过程中都遇到过Jar包冲突的问题&#xff0c;emm&#xff0c;在最近处理业务需求时我也遇到了不同版本jar包冲突导致项目加载出错的问题。主要是一个完整的项目会不可避免的使用第三方的Jar包来实现功能开发&#xff0c;各种第三方包之间可能…

【Linux】自动化构建工具-make/Makefile详解

前言 大家好吖&#xff0c;欢迎来到 YY 滴 Linux系列 &#xff0c;热烈欢迎&#xff01;本章主要内容面向接触过Linux的老铁&#xff0c;主要内容含 欢迎订阅 YY 滴Linux专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; 订阅专栏阅读&#xff1a;YY的《…

跨网段耦合器的作用

你是否曾经遇到过需要跨网段访问设备的问题&#xff1f;比如在工业自动化领域&#xff0c;PLC和数控设备的连接。这时候&#xff0c;远创智控YC8000-NAT就能帮你轻松解决。 1, 远创智控YC8000-NAT是一款功能强大的设备&#xff0c;它可以将LAN1口所连接PLC的IP地址和端口号&a…

使用wxPython和pillow开发拼图小游戏(四)

上一篇介绍了使用本地图片来初始化游戏的方法&#xff0c;通过前边三篇&#xff0c;该小游戏的主要内容差不多介绍完了&#xff0c;最后这一篇来介绍下游戏用时的计算、重置游戏和关闭窗口事件处理 游戏用时的计算 对于游戏用时的记录&#xff0c;看过前几篇的小伙伴可能也发现…

结构型设计模式之代理模式【设计模式系列】

系列文章目录 C技能系列 Linux通信架构系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 设计模式系列 期待你的关注哦&#xff01;&#xff01;&#xff01; 现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everythi…

springBoot使用webSocket的几种方式以及在高并发出现的问题及解决

一、第一种方式-原生注解&#xff08;tomcat内嵌&#xff09; 1.1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dependency>1.2、配置文件 package …

如何动态修改 spring aop 切面信息?让自动日志输出框架更好用

业务背景 很久以前开源了一款 auto-log 自动日志打印框架。 其中对于 spring 项目&#xff0c;默认实现了基于 aop 切面的日志输出。 但是发现一个问题&#xff0c;如果切面定义为全切范围过大&#xff0c;于是 v0.2 版本就是基于注解 AutoLog 实现的。 只有指定注解的类或…

数据结构之BinaryTree(二叉树)的实现

BinaryTree要实现的方法 总结 remove不在BinNode里&#xff0c;而是BinTree里 递归的两种写法 从上往下&#xff1a;同一对象的递归&#xff08;参数多一个&#xff0c;判空用一句话&#xff09;&#xff0c;子对象的递归&#xff08;参数void&#xff0c;判空用两句话&#…

对于awd

最近我们老师直接说要我准备awd&#xff0c;大概率要我上场我就顺便整理一下awd的资料&#xff08;准备写很多所以建议大家收藏一下&#xff09; 攻防指北 先来一个思维导图 Awd竞赛 AWD(Attack With Defense&#xff0c;攻防兼备)是一个非常有意思的模式&#xff0c;你需要…

Nginx配置整合:基本概念、命令、反向代理、负载均衡、动静分离、高可用

一、基本概念 1.什么是Nginx Nginx是一个高性能的HTTP和反向代理服务器&#xff0c;也是一个IMAP/POP3/SMTP代理server。其特点是占有内存少。并发能力强&#xff0c;其并发能力确实在同类型的网页server中表现较好。 http服务器 Web服务器是指驻留于因特网上某种类型计算机的程…

IT技术岗的面试技巧分享

我们在找工作时,需要结合自己的现状,针对意向企业做好充分准备。作为程序员,你有哪些面试IT技术岗的技巧?你可以从一下几个方向谈谈你的想法和观点。 方向一:分享你面试IT公司的小技巧 1、事先和邀约人了解公司的基本情况,比如公司的行业,规模,研发人员占比等 2、事先和…

cmder 使用简介

文章目录 1. cmder 简介2. 下载地址3. 安装4. 配置环境变量5. 添加 cmder 到右键菜单6. 解决中文乱码问题 1. cmder 简介 cmder 是一个增强型命令行工具&#xff0c;不仅可以使用 windows 下的所有命令&#xff0c;更爽的是可以使用 linux的命令, shell 命令。 2. 下载地址 …

【C#】MVC页面常见的重定向方式和场景

本篇文章主要简单讲讲&#xff0c;C# MVC 页面常见跳转或者重定向的方式和场景。 在实际项目开发中&#xff0c;在一些特定场景肯定会用到重定向&#xff0c;比如&#xff1a;不同角色跳转到不同视图地址 目录 一、种常见重定向方式1.1、RedirectToAction1.2、RedirectToRoute1…

【算法 -- LeetCode】(025) K 个一组翻转链表

1、题目 给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改变节点…