二叉树相关基础知识总结

一:树的概念

树是一种数据结构,它是由n(n>=1)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:

  1:每个结点有零个或多个子结点;

  2:没有父结点的结点称为根结点;

  3:每一个非根结点有且只有一个父结点;

  4:除了根结点外,每个子结点可以分为多个不相交的子树

二:树相关术语

节点的度:一个节点含有的子树的个数称为该节点的度;

叶节点或终端节点:度为0的节点称为叶节点;

非终端节点或分支节点:度不为0的节点;

双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;

孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点;

兄弟节点:具有相同父节点的节点互称为兄弟节点;

树的度:一棵树中,最大的节点的度称为树的度;

节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;

树的高度或深度:树中节点的最大层次;

堂兄弟节点:双亲在同一层的节点互为堂兄弟;

节点的祖先:从根到该节点所经分支上的所有节点;

子孙:以某节点为根的子树中任一节点都称为该节点的子孙。

森林:由m(m>=0)棵互不相交的树的集合称为森林;

三:树的种类

无序树:树中任意节点的子结点之间没有顺序关系,这种树称为无序树,也称为自由树;

有序树:树中任意节点的子结点之间有顺序关系,这种树称为有序树;

二叉树:每个节点最多含有两个子树的树称为二叉树;

完全二叉树

满二叉树

霍夫曼树:带权路径最短的二叉树称为哈夫曼树或最优二叉树;

四:二叉树

定义:在计算机科学中,二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。

二叉树的节点表示以及树的构建:

class Node:
    """二叉树节点类"""
    def __init__(self, item):
        self.value = item
        self.lchild = None
        self.rchild = None

class Tree:
    """二叉树"""
    def __init__(self):
        self.root = None

    def add(self, item):
        node = Node(item)
        if self.root == None:
            self.root = node
            return
        queue = [self.root]
        while queue:
            cur_node = queue.pop(0)
            if cur_node.lchild is None:
                cur_node.lchild = node
                return
            else:
                queue.append(cur_node.lchild)
            if cur_node.rchild is None:
                cur_node.rchild = node
                return
            else:
                queue.append(cur_node.rchild)

五:二叉树遍历

一:层次遍历

  即按照层次访问,通常用队列来做。访问根,访问子女,再访问子女的子女

二:先序遍历

  我们先访问根节点,然后递归使用先序遍历去访问左子树,再递归使用先序遍历访问右子树   (根节点   左子树    右子树)

三:中序遍历

  我们递归使用中序遍历去访问左子树,然后访问根节点,再递归使用中序遍历访问右子树   (左子树    根节点      右子树)

四:后序遍历

  我们递归使用后序遍历去访问左子树,然后递归使用后序遍历访问右子树,再访问根节点   (左子树    右子树     根节点)

代码实现:

class Node:
    """二叉树节点类"""
    def __init__(self, item):
        self.value = item
        self.lchild = None
        self.rchild = None

class Tree:
    """二叉树"""
    def __init__(self):
        self.root = None

    def add(self, item):
        node = Node(item)
        if self.root == None:
            self.root = node
            return
        queue = [self.root]
        while queue:
            cur_node = queue.pop(0)
            if cur_node.lchild is None:
                cur_node.lchild = node
                return
            else:
                queue.append(cur_node.lchild)
            if cur_node.rchild is None:
                cur_node.rchild = node
                return
            else:
                queue.append(cur_node.rchild)

    def level_travel(self):
        """层次遍历,广度优先
            从树的根节点开始 从上到下从左到右遍历整个树的节点
        """
        if self.root is None:
            return
        queue = [self.root]
        print(self.root.value, end=‘ ‘)
        while queue:
            cur_node = queue.pop(0)
            if cur_node.lchild is not None:
                print(cur_node.lchild.value, end=‘ ‘)
                queue.append(cur_node.lchild)
            if cur_node.rchild is not None:
                print(cur_node.rchild.value, end=‘ ‘)
                queue.append(cur_node.rchild)

    def pre_order(self, node):
        """先序遍历"""
        if node is None:
            return
        print(node.value, end=‘ ‘)
        self.pre_order(node.lchild)
        self.pre_order(node.rchild)

    def inorder(self, node):
        """中序遍历"""
        if node is None:
            return
        self.inorder(node.lchild)
        print(node.value, end=‘ ‘)
        self.inorder(node.rchild)

    def postorder(self, node):
        """后序遍历"""
        if node is None:
            return
        self.postorder(node.lchild)
        self.postorder(node.rchild)
        print(node.value, end=‘ ‘)

tree = Tree()
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)
tree.breadth_travel()      # 0 1 2 3 4 5 6 7 8 9
print(‘‘)
tree.pre_order(tree.root)   # 0 1 3 7 8 4 9 2 5 6
print(‘‘)
tree.inorder(tree.root)   # 7 3 8 1 9 4 0 5 2 6
print(‘‘)
tree.postorder(tree.root)  # 7 8 3 9 4 1 5 6 2 0

图解:

原文地址:https://www.cnblogs.com/yeyangsen/p/10197917.html

时间: 2024-11-10 04:01:02

二叉树相关基础知识总结的相关文章

网络连接相关基础知识笔记

一.常说的TCP/IP的含义 TCP/IP协议簇并不仅仅指TCP协议和IP协议,实际它包括了一系列协议组成的集合,如:TCP,IP,UDP,FTP,SMTP,DNS,ARP,PPP等 TCP与UDP协议都属于传输层协议,但有很大不同,TCP是面向连接的协议,提供的是可靠的数据流服务,TCP采用"带重传的肯定确认"机制来实现传输的可靠性,实现了一种"虚电路",因为从物理上来说,并不是真正在两台主机间建立了连接,这种连接只是存在于逻辑上的.最大的开销出现在通信前建立连接

深入理解mysql之BDB系列(1)---BDB相关基础知识

    深入理解mysql之BDB系列(1) ---BDB相关基础知识 作者:杨万富 一:BDB体系结构 1.1.BDB体系结构 BDB总体的体系结构如图1.1所看到的,包括五个子系统(见图1.1中相关数).1)数据存取子系统,2)事务子系统,3)锁子系统,4)内存池管理子系统,5)日志子系统. 在一个应用程序中,并不一定须要全然具备这5大子系统. 假设程序仅仅使用了数据存取子系统,它的体系结构如图1.2.在图1.2中,我们仅仅使了两个子系统:数据存取以及内存池子系统.(备注:另外三个子系统在B

图像增强相关基础知识

图像增强处理-1 图像增强是图像处理中一个重要的内容,在图像生成,传输或变换的过程中,由于多种因素的影响,造成图像质量下降,图像模糊,特征淹没,给分析和识别带来困难.因此,按特定的需要将图像中感兴趣的特征友选择地突出,衰减不需要的特征,提高图像的可懂度是图像增强的主要内容.图像增强不考虑图像降质的原因,而且改善后的图像也不一定逼近原图像,这是它与图像复原本质的区别.图像增强的主要目的有两个:一是改善图像的视觉效果,提高图像的清晰度:二是将图像转换成一种更适合人类或机器进行分析处理的形式,一边从图

【RAC】RAC相关基础知识

[RAC]RAC相关基础知识 1.CRS简介    从Oracle 10G开始,oracle引进一套完整的集群管理解决方案—-Cluster-Ready Services,它包括集群连通性.消息和锁.负载管理等框架.从而使得RAC可以脱离第三方集群件,当然,CRS与第三方集群件可以共同使用. (1).CRS进程 CRS主要由三部分组成,三部分都作为守护进程出现 <1>CRSD:资源可用性维护的主要引擎.它用来执行高可用性恢复及管理操作,诸如维护OCR及管理应用资源,它保存着集群的信息状态和OC

iOS蓝牙开发(一)蓝牙相关基础知识

原文链接: http://liuyanwei.jumppo.com/2015/07/17/ios-BLE-1.html iOS蓝牙开发(一)蓝牙相关基础知识: 蓝牙常见名称和缩写 MFI ======= make for ipad ,iphone, itouch 专们为苹果设备制作的设备 BLE ==== buletouch low energy,蓝牙4.0设备因为低耗电,所以也叫做BLE peripheral,central == 外设和中心,发起连接的时central,被连接的设备为peri

iOS蓝牙开发(一)蓝牙相关基础知识(转)

转载自:http://www.cocoachina.com/ios/20150915/13454.html 原文作者:刘彦玮 蓝牙常见名称和缩写 MFI ======= make for ipad ,iphone, itouch 专们为苹果设备制作的设备 BLE ==== buletouch low energy,蓝牙4.0设备因为低耗电,所以也叫做BLE peripheral,central == 外设和中心,发起连接的时central,被连接的设备为perilheral service an

SSD 相关基础知识

SDD 基础知识 SSD(Solid State Drives)是固态硬盘,使用闪存颗粒来存储数据,闪存又可分为NAND Flash和NOR Flash,通常所说的SSD硬盘都使用NAND Flash芯片来存放数据.NOR型存储内容以编码为主,其功能多与运算相关:NAND型主要功能是存储资料. Nor Flash:主要用来执行片上程序 优点:具有很好的读写性能和随机访问性能,因此它先得到广泛的应用: 缺点:单片容量较小且写入速度较慢,决定了其应用范围较窄. NAND Flash:主要用在大容量存

SQL学习(一)相关基础知识

RDBMS基础知识 1.数据库是按照数据结构来组织.存储和管理数据的仓库:数据库是一些关联表的集合. 2.数据表是数据的矩阵,在一个数据库中的表看起来像一个简单的电子表格. 3.列:一列包含了相同的数据. 4.行:一行是一组相关的数据. 5.冗余:存储两倍数据,冗余降低了性能,但是提高了数据的安全性. 6.主键:主键是唯一的.一个数据表中只能包含一个主键. 7.外键:外键是用于关联两个表. 8.复合键:复合键将多个列作为索引健,一般用于符合索引. 9.索引:使用索引可快速访问数据库表中的特定信息

XML的相关基础知识分享(二)

前面我们讲了一下XML相关的基础知识(一),下面我们在加深一下,看一下XML高级方面. 一.命名空间 1.命名冲突 XML命名空间提供避免元素冲突的方法. 命名冲突:在XML中,元素名称是由开发者定义的,当两个不同的文档使用相同的原俗名时,就会发生命名冲突.例如:下面这个XML文档携带者某个表格中的信息: 1 <table> 2 <tr> 3 <td>Apples</td> 4 <td>Bananas</td> 5 </tr&g