二叉树(一)-基础知识

0.前言

一直以来都在做Android开发,感觉算法这些都不是很好,所以准备从基本的数据结构开始学习,也相当于自己的学习笔记吧。

1.什么是二叉树

二叉树是树的一种,每个节点最多可具有两个子树,即结点的度最大为2(结点度:结点拥有的子树数)。

例:

二叉树.png

2.二叉树的种类

2.1 斜树

所有结点都只有左子树,或者右子树。

左斜树.png

2.2 满二叉树

所有的分支节点都具有左右节点。

满二叉树.png

2.3 完全二叉树

若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。

完全二叉树与非完全二叉树.png

3.二叉树的一些性质

  1. 二叉树第i层上的结点数目最多为 2^(i-1) (i≥1)
  2. 深度为h的二叉树至多有2^h-1个结点(h≥1)
  3. 包含n个结点的二叉树的高度至少为log2 (n+1)
  4. 在任意一棵二叉树中,若终端结点的个数为n0,度为2的结点数为n2,则n0=n2+1

4.二叉树的遍历方式

二叉树的遍历方式,一般分为前序遍历,中序遍历,后续遍历,层次遍历。

前、中、后序遍历是针对中间(父亲)节点来说的,如前序遍历,即先遍历中间(父亲)节点;中序遍历,就是第二个遍历中间(父亲)节点。这么说也许还是有点抽象,下面就举个栗子吧。

image.png
  • 前序遍历(中-左-右):1-2-4-8-9-5-10-3-6-7
  • 中序遍历:(左-中-右):8-4-9-2-10-5-1-6-3-7
  • 后序遍历(左-右-中):8-9-4-10-5-2-6-7-3-1

层次遍历就更简单了,也就是逐层遍历,接着上面例图,它的层次遍历结果为:1-2-3-4-5-6-7-8-9-10。值得一提的是,二叉树的层次遍历其实是利用了队列这个数据结构来实现的。

光谈理论总觉得差点什么,让人提不起兴趣。接下来就看看各个遍历方法如何用代码实现吧。正好最近在python,所以以下代码均为python实现。
不过在此之前,我们还是看看如何来创建一棵二叉树吧.

4.1 二叉树的创建

class node:
    def __init__(self, k=None, l=None, r=None) -> None:
        super().__init__()
        self.key = k
        self.left = l
        self.right = r


# 生成二叉树
def createBinaryTree():
    key = input("enter a value(# is the end of a leaf):")
    if key is "#":
        root = None
    else:
        root = node(key, createBinaryTree(), createBinaryTree())
    return root

首先定义了一个node类,只有三个属性,key表示键值,left表示左孩子,right表示右孩子,当然也可以加上父亲节点,不过这里还用不到父亲节点,所以就不用加上了。
接着写了一个createBinaryTree的方法,键入key的值,如果key的值为'#',则代表一个左节点(右节点)的结束。如果不是'#',那么就创建一个新的节点,利用递归思想继续创建。
还是老规矩,举个栗子,如果我们要创建以下这个二叉树,如果键入呢?

image.png

答案是:A-B-D-#-#-#-C-#-#。怎么样,是不是很简单呢。

好了知道如何创建一个二叉树,就该正式讲解如何遍历二叉树了。

4.2前序遍历

# 前序遍历
def pre_order(node):
    if node is None:
        return None
    else:
        print(node.key)
        pre_order(node.left)
        pre_order(node.right)

代码依然很简单,主要还是利用了递归的思想,拿上图来分析,A节点被传入,首先判断A是不是None,显然不是,所以我们打印A节点的键值,接着将A的左孩子传入,同样的B不是None,所以我们打印B,又将B的左孩子传入...,当D遍历然后,返回到B,B的右孩子为空,所以返回到A,传入A的右孩子C...。所以最后的遍历结果是:A-B-D-C

4.3 中序遍历

# 中序遍历
def in_order(node):
    if node is None:
        return None
    else:
        in_order(node.left)
        print(node.key)
        in_order(node.right)

分析同上,这里就不赘述了。遍历结果:D-B-A-C

4.4 后续遍历


# 后序遍历
def post_order(node):
    if node is None:
        return None
    else:
        post_order(node.left)
        post_order(node.right)
        print(node.key)

分析还是同上,遍历结果:D-B-C-A
其实,很容易发现,采用何种遍历方式,就是讲print(node.key)这句代码放在哪个位置。

4.5 层次遍历


# 层次遍历
def levelOrderTravel(node):
    if node is None:
        return
    q = [node]
    while len(q):
        print(q[0].key)
        node = q.pop(0)
        if node.left is not None:
            q.append(node.left)
        if node.right is not None:
            q.append(node.right)

上文中曾提到,二叉树的层次遍历其实是运用到了队列,我们还是用上面那个简单的二叉树来作分析,它的遍历结果为:A-B-C-D。代码是如何实现的呢?其实是首先将A入队,然后然后读取队首,判断其是否有左孩子,有则入队,然后判断右孩子,有则入队,最后将队首弹出,注意,队列的弹出顺序就是层次遍历的顺序

image.png

5.写在后面

二叉树的一些基本内容差不多就介绍这么多,之后准备写一点二叉树的应用。比如,二叉堆(堆排序),二叉搜索树等。

持续更新中...
二叉树(二)-二叉堆

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容

  • 树的概述 树是一种非常常用的数据结构,树与前面介绍的线性表,栈,队列等线性结构不同,树是一种非线性结构 1.树的定...
    Jack921阅读 4,432评论 1 31
  • B树的定义 一棵m阶的B树满足下列条件: 树中每个结点至多有m个孩子。 除根结点和叶子结点外,其它每个结点至少有m...
    文档随手记阅读 13,161评论 0 25
  • 数据结构和算法--二叉树的实现 几种二叉树 1、二叉树 和普通的树相比,二叉树有如下特点: 每个结点最多只有两棵子...
    sunhaiyu阅读 6,422评论 0 14
  • 这几天开学,学校还在上课,最近也是在找工作,很多天都没有更新文章,现在补一篇二叉树的文章。 最近校招公司的笔试陆续...
    zero_sr阅读 3,939评论 0 5
  • 树和二叉树 1、树的定义 树(Tree)是由一个 或 多个结点 组成的有限集合T,且满足: ①有且仅有一个称为根的...
    利伊奥克儿阅读 1,347评论 0 1