数据结构:二叉树

一,基本概念

二叉树(BinaryTree)是每个节点最多有两个子树的树结构。通常子树分为左子树右子树,如图:

img

二,特性

  1. 在二叉树的第i层上最多有2^(i-1)个节点(i>0)

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

  3. 对于任意一颗二叉树,如果度数为0的节点数为a,而度数为2的节点总数为b,则a=b+1*(度:一个节点含有的子树的个数称为该节点的度)*

  4. 具有n个节点的完全二叉树的深度必为:log2(n+1)(以2为底的(n+1)的对数

  5. 对于完全二叉树,如果按照从上至下从左至右的数组顺序从0开始编号,对于编号为i的节点:

    1
    2
    3
    4
    5
    6
    7
    (1). 若i>0,i 位置节点的双亲序号:(i-1)/2;i=0,i为根节点编号,无双亲节点

    (2). 若 2i+1< n,左孩子序号: 2i+1;否则无左孩子

    (3). 若 2i+2< n,右孩子序号: 2i+2;否则无右孩子


三,两种特殊的二叉树

1,满二叉树:

除叶节点外每一个节点都有左右子节点,且叶子结点都处在最底层

2,完全二叉树:

对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。 满二叉树是一种特殊的完全二叉树。

img

四,二叉树的创建与遍历

创建:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 节点类
class Node(object):
def __init__(self, elem, lchild=None, rchild=None):
self.elem = elem # 本身值
self.lchild = lchild # 左孩子
self.rchild = rchild # 右孩子

# 树类
class BinaryTree(object):
def __init__(self, root=None):
self.root = root # root为根节点

def add(self, elem): # 为树添加节点
node = Node(elem)
if not self.root: #如果树是空的,则对根节点赋值
self.root = node
else:
queue = []
queue.append(self.root)
while Ture: #对已有的节点进行层次遍历
cur = queue.pop(0)
if not cur.lchild:
cur.lchild = node
return
elif not cur.rchild:
cur.rchild = node
return
else:
queue.append(cur.lchild)
queue.append(cur.rchild)
遍历:树的两种重要的遍历模式是深度优先遍历和广度优先遍历,深度优先遍历又分为先序、中序和后序,本文给出广度优先遍历方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
    def breadth_travel(self):                                # 从树的root开始,从上到下从从左到右遍历整个树的节点
if not self.root:
return
queue = []
queue.append(self.root)
while queue:
node = queue.pop(0)
print(node.elem, end=" ")
if node.lchild:
queue.append(node.lchild)
if node.rchild:
queue.append(node.rchild)

if __name__ == '__main__':
tree = BinaryTree()
tree.add(0)
tree.add(1)
tree.add(2)
tree.add(3)
tree.add(4)
tree.add(5)
tree.add(6)
tree.add(7)
tree.add(8)
tree.add(9)
print("广度优先遍历(层次遍历):", end=" ")
tree.breadth_travel()

运行结果:

1
广度优先遍历(层次遍历): 0 1 2 3 4 5 6 7 8 9 

3-3周报

计算机天才协会学习周报

本周学习大纲

Python:在PTA做题

学开车

本周学习日历

日期 学习内容
周一 Python:PTA刷题
周二 Python:PTA刷题
周三 Python:PTA刷题
周四 Python:PTA刷题
周五 Python:PTA刷题
周六 Python:PTA刷题,去驾校练车
周日 Python:PTA刷题

本周学习总结

为天梯赛做准备,虽然入队希望不大,但是还是尽力刷题,主要就是在PTA上刷题,一周下来,L1部分完成一半了,其中,然后稍微了解了一下”贪心算法“

也记住了几个忘记了的函数

2.26周报

计算机天才协会学习周报

本周学习大纲

Python:在洛谷做题

本周学习日历

日期 学习内容
周一 Python:洛谷做题五道
周二 Python:洛谷刷题
周三 Python:洛谷做题
周四 Python:洛谷做题
周五 Python:洛谷做题
周六 Java:粗略回顾了前几周学习的新知识
周日 返校

本周学习总结

依然是刷题,入门部分差不多完成一半了,有些小问题还需加强,但是发现蓝桥杯已经过了报名时间,准备下周开始学习Python利用其它工具完成需求的延伸部分,

2.18学习周报

计算机天才协会学习周报

本周学习大纲

Python:在洛谷做题

本周学习日历

日期 学习内容
周一 偷懒没学
周二 开始学习,在洛谷刷题
周三 Python:洛谷做题
周四 Python:洛谷做题
周五 Python:洛谷做题
周六 Python:洛谷做题
周日 Python:洛谷做题

本周学习总结

这周主要就是刷题,由于之前做的Python笔记丢失了,做题的时候出现许多困难,几乎没有一次能一次过,也没有能迅速查找到知识点的笔记,其中,格式化似乎是一个重要的知识块。

1.29-2.4周报

计算机天才协会学习周报

本周学习大纲

1.继续学习Java

2.python:在洛谷做题

本周学习日历

日期 学习内容
周一 Java:接口,内部类
周二 Java:内部类
周三 Java:枚举
周四 没学习
周五 Python:洛谷做题
周六 Python:洛谷做题
周日 Python:洛谷做题

本周学习总结

好像越来越懒了。。。。。。但是至少算是保持了每周多少能进步一点吧,其中在做Python题的时候发现Python许多细节还有些模糊,希望下周加强

1.22-1.28周报

计算机天才协会学习周报

本周学习大纲

  1. 继续学习Python
  2. 继续学习Java

本周学习日历

日期 学习内容
周一 处理了学习pyecharts过程中出现的问题
周二 继续学习关于pyecharts的操作
周三 家里有事,暂停一天
周四 Java:final、常量
周五周六 java:抽象
周日 Java:接口

本周学习收获

java的学习内容逐渐变难了,越发抽象,相比之前的一些内容,需要更多的实操来理解,相应地,每一处也需要更多的时间来学习

pyecharts

一、Pyecharts是什么?

pyecharts是一个用于生成Echarts图表的类库,利用其中的函数能够很好的实现数据可视化,是Python的可视化库之一。

二、Pyecharts如何安装和使用

1、安装Pyecharts:

使用pip包管理工具,在命令行中安装

1
pip install pyecharts

2、在python编译器中导入Pyecharts

1
2
import pyecharts
from pyecharts import charts

3、创建列表对象

以折线图“中美英三国GDP对比”为例

1
2
# 创建折线图对象
line = charts.Line()

4、设置图标数据和属性

1
2
3
4
5
6
7
8
#X轴数据
line.add_xaxis(["中国","美国","英国"])
# y轴数据
line.add_yaxis("GDP",[30,20,10])
#设置全局配置项
line.set_global_opts(
title_opts=TitleOpts(title="GDP展示")
)

5、渲染图标

使用渲染方法将图表渲染为 HTML 文件并在浏览器中显示出来

1
2
# 通过rander方法,将代码生成为图像
line.render()

这样使在pycharm中自动生成了一个html文件

接着用任意浏览器打开,

1.15-1.21

本周学习大纲

  1. Python复习
  2. java复习
  3. Python学习

本周学习日历

日期 学习内容
周一 粗略复习Python
周二 粗略复习考核期java编程
周三 pyecharts
周四 pyecharts
周五 MySQL
周六 MySQL
周日 了解PySpark并学习数据输入

本周学习收获

Python的书上没有的知识比我中的多,从而本周并未完成计划中“补全Python中未纳入课程的知识”

post1.15-1.21周报

本周学习大纲

  1. Python复习
  2. java复习
  3. Python学习

本周学习日历

日期 学习内容
周一 粗略复习Python
周二 粗略复习考核期java编程
周三 pyecharts
周四 pyecharts
周五 MySQL
周六 MySQL
周日 了解PySpark并学习数据输入

本周学习收获

Python的书上没有的知识比我中的多,从而本周并未完成计划中“补全Python中未纳入课程的知识”

12.25-12.31学习周报

学习大纲

  1. java:复习,巩固
  2. 期末复习:高数知识点,线性代数知识点,英语

本周学习日历

日历 学习内容 其他
星期一 复习java题目,博客的搭建中类似文件上传的部分
星期二 复习高数至第二章
星期三 复习高数第三章以及英语第一单元
星期四 复习高数知识点完成
星期五 复习线代知识点第一二章
星期六 复习线性代数知识点第三章以及英语第一、三单元
星期天 复习线性代数知识点至第五章

本周学习收获及内容

笔记:

D:\软件\MyBlog\source_posts

完成状态

高数知识点复习完成,线代知识点复习完成90%

学习收获

博客在搭建以及上传的整个过程中,还是有些点没注意到。还有java,这段时间没什么时间学了,假期应该注意加强。

期末复习每个章节用时总是比预想中要多,搞不好时间就不够了,应该多分配一点时间。