数据结构与算法-树

树的概念

树(英语:tree)是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合

4个特点

每个节点有零个或多个子节点;
没有父节点的节点称为根节点;
每一个非根节点有且只有一个父节点;
除了根节点外,每个子节点可以分为多个不相交的子树
在这里插入图片描述
在这里插入图片描述
E没有父节点, 它是根节点
A, F是E的子节点
其中也是BCD的父节点,
然后BCD称为兄弟节点
最下面的是叶子节点叶节点

高度(Height)、深度(Depth)、层(Level)

节点高度:叶子节点到其节点的个数(一般从0开始)
树的高度:叶子节点到根节点的个数(一般从0开始)
节点的深度:从节点到哦叶子节点的个数(一般从0开始)
节点的层:节点到叶子节点的个数(一般从1开始)也有资料说从0开始,不过没有影响

树的种类

无序树:树中任意节点的子节点之间没有顺序关系,这种树称为无序树,也称为自由树
有序树:节点之间有顺序关系
有序树又分为:二叉树. 霍夫曼树****B树
**霍夫曼树(用于信息编码):**带权路径最短的二叉树称为哈夫曼树或最优二叉树;
**B树:**一种对读写操作进行优化的自平衡的二叉查找树,能够保持数据有序,拥有多余两个子树

二叉树

**二叉树:**每个节点最多含有两个子树的树称为二叉树;
完全二叉树:对于一颗二叉树,假设其深度为d(d>1)。除了第d层外,其它各层的节点数目均已达最大值,且第d层所有节点从左向右连续地紧密排列,这样的二叉树被称为完全二叉树,其中满二叉树的定义是所有叶节点都在最底层的完全二叉树;
**平衡二叉树(AVL树):**当且仅当任何节点的两棵子树的高度差不大于1的二叉树;
排序二叉树(二叉查找树(英语:Binary Search Tree),也称二叉搜索树、有序二叉树);
在这里插入图片描述

实现广度优先
class Node(object):
    def __init__(self, item, left_item = None, right_item = None):

        self.item = item
        self.left_item = left_item
        self.right_item = right_item
class Tree(object):
    def __init__(self, root = None):
        self.root = root
    def add(self, item):
        node = Node(item)
        if self.root == None:
            self.root = node
        else:
            queue = []
            queue.append(self.root)
            while queue:
                cur  = queue.pop(0)

                if cur.left_item == None: #左如果为空,就加在左边
                    cur.left_item = node
                    return
                elif cur.right_item == None:#右边如果为空,就加在右边
                    cur.right_item = node
                    return

                else:  #如果都不为空,就加入列表继续判断
                    queue.append(cur.left_item)
                    queue.append(cur.right_item)
    def breach(self):
        if self.root == None:
            return
        else:
            queue = []
            queue.append(self.root)
            while queue:
                node = queue.pop(0)
                print(node.item, end = " ")
                if node.left_item != None:  #如果不为空就加入列表弹出
                    queue.append(node.left_item)
                if node.right_item != None:
                    queue.append(node.right_item)
if __name__ == '__main__':
    tree = Tree()
    tree.add(0)
    tree.add(1)
    tree.add(2)
    tree.breach()

深度优先(重点)

分为先序遍历中序遍历后序遍历
这个先后是相对于根节点来说的, 对应分别是根节点先中后, 就是根节点打印顺序不同, 都是先打印左节点在打印右节点
在这里插入图片描述

代码实现
    def preorder(self, node):
        """递归实现先序遍历"""
        if node == None:
            return
        print(node.item, end=" ")
        self.preorder(node.left_item)
        self.preorder(node.right_item)
    def inorder(self, node):
        """递归实中序遍历"""
        if node == None:
            return
        self.inorder(node.left_item)
        print(node.item, end=" ")
        self.inorder(node.right_item)
    def postorder(self, node):
        """递归实现后序遍历"""
        if node == None:
            return
        self.postorder(node.left_item)
        self.postorder(node.right_item)
        print(node.item, end=" ")

如果想要确定一颗树, 就必须要中序遍历与另外一个遍历
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值