数据结构与算法:树与二叉树(python实现二叉树)

文章目录

  • 树与树算法
    • 树的定义,特点
    • 树的术语
    • 二叉树
      • 二叉树的性质
      • 二叉树的分类
    • 树的存储与表示
      • 节点的结构:
    • 二叉树实现
  • 二叉树的遍历
    • 广度优先遍历(层次遍历)
    • 深度优先遍历
      • 先序遍历
      • 中序遍历
      • 后序遍历

树与树算法

树的定义,特点

树(英语:tree)是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。
它是由n(n>=1)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵
倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:

  • 每个节点有零个或多个子节点;
  • 没有父节点的节点称为根节点;
  • 每一个非根节点有且只有一个父节点;
  • 除了根节点外,每个子节点可以分为多个不相交的子树;

树的术语

数据结构与算法:树与二叉树(python实现二叉树)_第1张图片
节点的度: 一个节点含有的子树的个数称为该节点的度;
树的度: 一棵树中,最大的节点的度称为树的度;
数据结构与算法:树与二叉树(python实现二叉树)_第2张图片
叶节点或终端节点, 父亲节点或父节点, 孩子节点或子节点, 兄弟节点

二叉树

数据结构与算法:树与二叉树(python实现二叉树)_第3张图片

二叉树的性质

  • 二叉树中,第 i 层最多有 2i-1 个结点。
  • 如果二叉树的深度为 K,那么此二叉树最多有 2K-1 个结点。
  • 二叉树中,终端结点数(叶子结点数)为 n0,度为 2 的结点数为 n2,则 n0=n2+1。

二叉树的分类

1). 如果二叉树中除了叶子结点,每个结点的度都为 2,则此二叉树称为满二叉树。
2). 如果二叉树中除去最后一层节点为满二叉树,且最后一层的结点依次从左到右分布,则此二叉树被称为完全二叉树。

树的存储与表示

顺序存储: 将数据结构存储在固定的数组中,然在遍历速度上有一定的优势,但因所占空间比较大,是非主流二叉树。二叉树通常以链式存储。
数据结构与算法:树与二叉树(python实现二叉树)_第4张图片

节点的结构:

数据结构与算法:树与二叉树(python实现二叉树)_第5张图片

二叉树实现

class Node(object):
    """节点类"""
    def __init__(self, elem=-1, lchild=None, rchild=None):
        self.elem = elem
        self.lchild = lchild
        self.rchild = rchild
class Tree(object):
    """树类"""
    def __init__(self, root=None):
        self.root = root
    def add(self, elem):
        """为树添加节点"""
        node = Node(elem)
        #如果树是空的,则对根节点赋值
        if self.root == None:
            self.root = node
        else:
            queue = []
            queue.append(self.root)
            #对已有的节点进行层次遍历
            while queue:
                #弹出队列的第一个元素
                cur = queue.pop(0)
                if cur.lchild == None:
                    cur.lchild = node
                    return
                elif cur.rchild == None:
                    cur.rchild = node
                    return
                else:
                    #如果左右子树都不为空,加入队列继续判断
                    queue.append(cur.lchild)
                    queue.append(cur.rchild)

二叉树的遍历

遍历是指对树中所有结点的信息的访问,即依次对树中每个结点访问一次且仅访问一次,我们把这种对所有节点的访问称为遍历(traversal)
数据结构与算法:树与二叉树(python实现二叉树)_第6张图片

广度优先遍历(层次遍历)

数据结构与算法:树与二叉树(python实现二叉树)_第7张图片

def breadth_travel(self, root)
"""层次遍历"""
    if root == None:
        return
    queue = []
    queue.append(root)
    while queue:def breadth_travel(self, root):
    """利用队列实现树的层次遍历"""
        node = queue.pop(0)
        print(node.elem,end=",")
        if node.lchild != None:
            queue.append(node.lchild)
        if node.rchild != None:
            queue.append(node.rchild)
    print()

深度优先遍历

数据结构与算法:树与二叉树(python实现二叉树)_第8张图片
先序遍历: 1 2 4 5 3 6 7

中序遍历: 4 2 5 1 6 3 7

后序遍历: 4 5 2 6 7 3 1

先序遍历

每遇到一个节点,先访问,然后再遍历其左右子树

def preorder(self, root):
        """递归实现先序遍历"""
        if root == None:
                return
        print(root.elem)
        self.preorder(root.lchild)
        self.preorder(root.rchild)

中序遍历

第一次经过时不访问根节点,等遍历完左子树之后再访问,然后遍历右子树

def inorder(self, root):
    """递归实现中序遍历"""
    if root == None:
        return
    self.inorder(root.lchild)
    print(root.elem, end=',')
    self.inorder(root.rchild)    

后序遍历

第一次和第二次经过时都不访问,等遍历完该节点的左右子树之后,最后访问该节点

def postorder(self, root):
    """递归实现后续遍历"""
    if root == None:
        return
    self.postorder(root.lchild)
    self.postorder(root.rchild)
    print(root.elem, end=',')

你可能感兴趣的:(Python笔记)