009——二叉树

目录

二叉树的五种基本形态:

1.二叉树可以是空树

2.只有一个根节点的树

3.斜树:只有左子树或右子树的树

4.左右孩子都有的树

二叉树的性质:

1.假设根节点是第一层,在二叉树的第i层上最多有2^(n-1)个结点

2.深度为k的二叉树,最多有(2^k)-1个结点

3.任意一个非空二叉树,度为0的结点数比度为2的结点数多一个

4.在完全二叉树中有无度为1的判断

5.具有N个结点的完全二叉树的深度为log2(N+1)(向下取整)或者(log2N)+1(向上取整)

6. 如果有一棵n个结点的完全二叉树,其结点编号按照层次序(从上到下,从左到右),则除根结点外,满足[i/2 , i, 2i, 2i+1]的规则

二叉树的存储方式

1.直接采用数组存储二叉树,将任意一个二叉树补成完全二叉树,不过这样容易造成空间上的浪费

2.二叉链表存储


二叉树是树中最常用的一种,即度为2的树(每个结点最多有两个孩子),在二叉树中,结点的度只有0、1、2这三种可能

二叉树的五种基本形态:

1.二叉树可以是空树

2.只有一个根节点的树

3.斜树:只有左子树或右子树的树

4.左右孩子都有的树

二叉树的性质:

1.假设根节点是第一层,在二叉树的第i层上最多有2^(n-1)个结点

解释:若想要结点数最多,则要求除叶子结点外,每个结点的度都为2

层数                                        该层结点数

一层:        根节点                        1

二层:        1*2                             2

三层            2*2                             4

四层            4*2                             8

 n层           2*2*...*2                    2^(n-1)

2.深度为k的二叉树,最多有(2^k)-1个结点

将所有层次的结点数相加,再根据等比数列求和公式可得

满二叉树

而有(2^k)-1个结点的树有被称作满二叉树,满二叉树没有度为1的结点

完全二叉树

对满二叉树的结点编号(从上到下再从左到右)从后面删除若干个连续的编号最大的结点,剩下的部分就是完全二叉树

如下图删除15.14.13

同时,对于完全二叉树来说,度为1的结点要么没有,要么只有一个

满二叉树也是完全二叉树

3.任意一个非空二叉树,度为0的结点数比度为2的结点数多一个

解释:

按照度来分,我们可以将其分成度分别为0,1,2的结点:

n = n0 + n1 + n2

按照有无父亲,或者说是是否可以当作孩子结点,我们可以分成根节点和其他结点:

n = 1 + (n-1)

而在这(n-1)个孩子结点里,我们可以再将每个结点看作父亲,

度为0的父亲没有孩子        0 * n0

度为1的父亲一个孩子        1 * n1

度为2的父亲两个孩子        2 * n1

所以可以推出

n = 1 +  0 * n0 +  n1 + 2n1

n0 + n1 + n2  = 1 +   n1 + 2n1

                 n0 = n2 + 1

或者从连线个数的角度理解:

n个结点的树有n-1条连线

度为0的树向下有0条

度为1的树向下有n1条

度为2的树向下有2n2条

n1+n2+n0-1 =n1+2n2 

             n0-1=n2

4.在完全二叉树中有无度为1的判断

没有度为1的结点,n=n0+n2=n2+1+n2=2n2+1

有度为1的结点,n=n0+n1+n2=2n2+2

所以在完全二叉树中,结点数为奇数,没有度为1的结点;结点数为偶数,有度为1的结点且只有1个

5.具有N个结点的完全二叉树的深度为log2(N+1)(向下取整)或者(log2N)+1(向上取整)

6. 如果有一棵n个结点的完全二叉树,其结点编号按照层次序(从上到下,从左到右),则除根结点外,满足[i/2 , i, 2i, 2i+1]的规则

二叉树的存储方式

1.直接采用数组存储二叉树,将任意一个二叉树补成完全二叉树,不过这样容易造成空间上的浪费

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>
#include<stdlib.h>
char data[1005];
int flag;//=0 左  =1右孩子 
int find(char fx)
{for (int i = 1; i < 1005; i++){if (data[i] == fx){return i;}}
}
int main()
{int n;char root;printf("读入数据个数:\n");scanf("%d", &n);for (int i = 0; i < 1005; i++){data[i] = ' ';}getchar();printf("读入根结点:\n");scanf("%c", &root);data[1] = root;char x, fx;//数据为x,fx为x的父亲  int fxi, xi;for (int i = 1; i <= n - 1; i++){getchar();printf("读入剩下的结点(x fx flag):\n");scanf("%c %c %d", &x, &fx, &flag);fxi = find(fx);//寻找父亲结点的下标 if (flag == 0){xi = 2 * fxi;}else {xi = 2 * fxi + 1;}data[xi] = x;}getchar();printf("查找某个结点的孩子父亲结点:\n");scanf("%c", &x);xi = find(x);if (xi == 1){printf("根节点,无父亲节点\n");}else {printf("父亲结点:%c\n", data[xi / 2]);}printf("孩子节点是:%c %c\n", data[2 * xi], data[2 * xi + 1]);return 0;
}

2.二叉链表存储

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
//二叉链表节点结构
typedef struct BTNode {char data;struct BTNode* left;//保存左孩子地址struct BTNode* right;//保存右孩子地址//struct BTNode* fa;//保存父亲的地址 
}BTNode, * BTree;
BTree initBTree(char root)
{BTNode* r = (BTNode*)malloc(sizeof(BTNode));if (r == NULL){printf("空间分配失败\n");return NULL;}r->data = root;r->left = r->right = NULL;//r->fa=NULL; return r;
}
BTNode* find(BTree r, char fx)
{if (r == NULL || r->data == fx){return r;}if (r->left != NULL){BTNode* ans = find(r->left, fx);if (ans != NULL && ans->data == fx){return ans;}}if (r->right != NULL){BTNode* ans = find(r->right, fx);if (ans != NULL && ans->data == fx){return ans;}}return NULL;
}BTree insert(BTree r, char x, char fx, int flag)
{BTNode* f = find(r, fx);if (f == NULL){printf("父亲节点不存在,不能插入\n");}else{BTNode* s = (BTNode*)malloc(sizeof(BTNode));//判断s==NULLs->data = x;s->left = s->right = NULL;//s->fa=f;if (flag == 0){f->left = s;}else {f->right = s;}}return r;
}
int main()
{int n;int flag;//=0 左  =1右孩子 BTree r = NULL;char root;printf("输入结点的总个数:\n");scanf("%d", &n);getchar();printf("输入根节点:\n");scanf("%c", &root);r = initBTree(root);char x, fx;for (int i = 1; i <= n - 1; i++){getchar();printf("输入结点信息(x, fx, flag):\n");scanf("%c %c %d", &x, &fx, &flag);r = insert(r, x, fx, flag);}getchar();printf("输入要查找的结点:\n");scanf("%c", &x);BTNode* p = find(r, x);if (p != NULL && p->left != NULL){printf("左孩子%c\n", p->left->data);}if (p != NULL && p->right != NULL){printf("右孩子%c\n", p->right->data);}return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WebGoat JAVA反序列化漏洞源码分析

目录 InsecureDeserializationTask.java 代码分析 反序列化漏洞知识补充 VulnerableTaskHolder类分析 poc 编写 WebGoat 靶场地址&#xff1a;GitHub - WebGoat/WebGoat: WebGoat is a deliberately insecure application 这里就不介绍怎么搭建了&#xff0c;可以参考其他…

基于SSM的旅游网站【附源码】

基于SSM的旅游网站&#xff08;源码L文说明文档&#xff09; 目录 4 系统设计 4.1 系统概要设计 4.2 系统功能结构设计 4.3 数据库设计 4.3.1 数据库E-R图设计 4.3.2 数据库表结构设计 5 系统实现 5.1 管理员功能介绍 5.1.1 用户管理 5.1.2 …

【进阶】面向对象之权限修饰符代码块

文章目录 权限修饰符权限修饰符的使用规则 代码块分类局部代码块(了解就行)构造代码块(了解就行)静态代码块(重点) 权限修饰符 权限修饰符的使用规则 成员变量私有方法公开 特例&#xff1a; 如果方法中的代码是抽取其他方法中共性代码&#xff0c;这个方法一般也私有. 代码…

如何“半路出家”转行算法工程师的?

01 关于择业考虑 算法岗是什么&#xff1f; 算法岗&#xff0c;从根本内容上来说&#xff0c;是算法&#xff0c;算力&#xff0c;数据&#xff0c;应用场景的交集。从工作要求的角度来讲&#xff0c;是你的能力能够匹配大厂需要的工作要求。从个人角度来说&#xff0c;是你…

hbuilderx+uniapp+Android健身房管理系统 微信小程序z488g

目录 项目介绍支持以下技术栈&#xff1a;具体实现截图HBuilderXuniappmysql数据库与主流编程语言java类核心代码部分展示登录的业务流程的顺序是&#xff1a;数据库设计性能分析操作可行性技术可行性系统安全性数据完整性软件测试详细视频演示源码获取方式 项目介绍 用户功能…

初级网络工程师之从入门到入狱(五)

本文是我在学习过程中记录学习的点点滴滴&#xff0c;目的是为了学完之后巩固一下顺便也和大家分享一下&#xff0c;日后忘记了也可以方便快速的复习。 网络工程师从入门到入狱 前言一、链路聚合1.1、手动进行链路聚合1.1.1、 拓扑图&#xff1a;1.1.2、 LSW11.1.3、 LSW2 1.2、…

RabbitMQ(学习前言)

目录 学习MQ之前有必要先去温故下微服务知识体系&#xff0c;以加深本章节的理解 一、微服务间的通讯方式 1. 基本介绍 2. 同步通讯 2.1. 什么是同步通讯 2.2. 同步通讯存在的问题 问题一&#xff1a;耦合度高 问题二&#xff1a;性能和吞吐能力下降 问题三&#xff1a…

SpringMVC源码-处理器适配器HandlerAdapter

因为定义controller的方式有三种&#xff0c;每种不同的方式调用的方法不同&#xff0c;尤其是注解修饰的 方法名是自定义的 因此需要通过适配器模式来调用方法执行 initStrategies进行适配器的初始化 处理器适配器一共有如下四种: org.springframework.web.servlet.Handl…

数据结构与算法——Java实现 32.堆

人的想法和感受是会随着时间的认知改变而改变&#xff0c; 原来你笃定不会变的事&#xff0c;也会在最后一刻变得释然 —— 24.10.10 堆 堆是基于二叉树实现的数据结构 大顶堆每个分支的上一个节点的权值要大于它的孩子节点 小顶堆每个分支的上一个节点的权值要小于它的孩子…

开源催生开源:Tesla 如何加速 AI 发展

特斯拉最近宣布开源其特斯拉以太网传输协议 &#xff08;TTPoE&#xff09;&#xff0c;这是一种尖端网络结构&#xff0c;专为 AI/ML 数据中心环境中的高速、低延迟数据传输而设计&#xff0c;从而掀起了波澜。此举反映了特斯拉利用开源战略加速全行业进步的更广泛历史&#x…

Spring Boot课程问答:技术难题轻松解决

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

基于pytorch的手写数字识别-训练+使用

import pandas as pd import numpy as np import torch import matplotlib import matplotlib.pyplot as plt from torch.utils.data import TensorDataset, DataLoadermatplotlib.use(tkAgg)# 设置图形配置 config {"font.family": serif,"mathtext.fontset&q…

洗衣店订单管理:Spring Boot技术革新

3系统分析 3.1可行性分析 通过对本洗衣店订单管理系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本洗衣店订单管理系统采用JAVA作为开发语言&#xff0c;S…

pytest(六)——allure-pytest的基础使用

前言 一、allure-pytest的基础使用 二、需要掌握的allure特性 2.1 Allure报告结构 2.2 Environment 2.3 Categories 2.4 Flaky test 三、allure的特性&#xff0c;allure.step()、allure.attach的详细使用 3.1 allure.step 3.2 allure.attach&#xff08;挺有用的&a…

如何利用wsl-Ubuntu里conda用来给Windows的PyCharm开发

前提&#xff1a;咱们在wsl-Ubuntu上&#xff0c;有conda的虚拟环境 咱们直接打开PyCharm,打开Settings 更换Python Interpreter即可 当然一开始可能没有下面的选项&#xff0c;需要我们点击右边的Add Interpreter 这里选择wsl 点击next 将这两步进行修改 可以看出来&#xff0…

kubernetes中微服务部署

微服务 问&#xff1a;用控制器来完成集群的工作负载&#xff0c;那么应用如何暴漏出去&#xff1f; 答&#xff1a;需要通过微服务暴漏出去后才能被访问 Service 是一组提供相同服务的Pod对外开放的接口借助Service&#xff0c;应用可以实现服务发现和负载均衡Service 默认只…

智谱开放平台API调用解析

一、什么是智谱AI 智谱AI成立于2019年&#xff0c;由‌清华大学计算机系知识工程实验室的技术成果转化而来&#xff0c;是一家致力于人工智能技术研发和应用的公司。智谱致力于打造新一代认知智能大模型&#xff0c;专注于做大模型的中国创新。 二、智谱开放平台API调用 官方文…

【LeetCode】动态规划—673. 最长递增子序列的个数(附完整Python/C++代码)

动态规划—673. 最长递增子序列的个数 前言题目描述基本思路1. 问题定义2. 理解问题和递推关系3. 解决方法3.1 动态规划方法3.2 优化方法 4. 进一步优化5. 小总结 代码实现PythonPython3代码实现Python 代码解释 CC代码实现C 代码解释1. 初始化&#xff1a;2. 动态规划过程&…

FiBiNET模型实现推荐算法

1. 项目简介 A031-FiBiNET模型项目是一个基于深度学习的推荐系统算法实现&#xff0c;旨在提升推荐系统的性能和精度。该项目的背景源于当今互联网平台中&#xff0c;推荐算法在电商、社交、内容分发等领域的广泛应用。推荐系统通过分析用户的历史行为和兴趣偏好&#xff0c;预…

Django学习笔记十三:优秀案例学习

Django CMS 是一个基于 Django 框架的开源内容管理系统&#xff0c;它允许开发者轻松地创建和管理网站内容。Django CMS 提供了一个易于使用的界面来实现动态网站的快速开发&#xff0c;并且具有丰富的内容管理功能和多种插件扩展。以下是 Django CMS 的一些核心特性和如何开始…