数据结构-树和二叉树

正文

  • 二叉树

 树

树是一种可以递归定义的数据结构,例如目录结构

树是由n个节点组成的集合:如果n=0,那么就是一颗空树;如果n>0,那么存在1个节点作为树的根节点,其他节点可以分为m个集合,每个集合本身又是一颗树。

一些基本概念:

根节点:根结点为第1层,例如A

叶子节点:例如B、H、P等

树的高度(或深度):是树中结点的最大层数。图中树的高度为4,即有4层

树的度:树中一个结点的孩子个数称为该结点的度,树中结点的最大度数称为树的度,上图的度为6(第二层)

 

二叉树

「二叉树 Binary Tree」是每个节点最多有两个子树的树结构,即二叉树中不存在度大于二的节点。并且,二叉树的子树有左右之分,其次序不能颠倒。

满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树

完全二叉树:叶节点只能出现在最下层和次下层,并且最下面一层的结点都集中在该层最左边的若干位置的二叉树。

二叉树存储方式:

  • 链式存储
  • 顺序存储(堆排序已经说明)

 二叉树链式存储:二叉树的链式存储:将二叉树的节点定义为一个对象,节点之间通过类似链表的链接方式来连接。

class BiTreeNode:
    def __init__(self, data):
        self.data = data
        self.lchild = None    # 左孩子
        self.rchild = None    # 右孩子

二叉树遍历方式:

  • 前序遍历: EACBDGF
  • 中序遍历: ABCDEGF
  • 后序遍历: BDCAFGE
  • 层次遍历: EAGCFBD

 

复制代码
from collections import deque

class BiTreeNode:
    def __init__(self, data):
        self.data = data
        self.lchild = None
        self.rchild = None

# 根据上图创建对应的数
a = BiTreeNode("A")
b = BiTreeNode("B")
c = BiTreeNode("C")
d = BiTreeNode("D")
e = BiTreeNode("E")
f = BiTreeNode("F")
g = BiTreeNode("G")

e.lchild = a
e.rchild = g
a.rchild = c
c.lchild = b
c.rchild = d
g.rchild = f

root = e    # 根节点

# 前序遍历
def pre_order(root):
    if root:
        print(root.data, end=",")
        pre_order(root.lchild)
        pre_order(root.rchild)

pre_order(root)  # EACBDGF
print(" ")

# 中序遍历
def in_order(root):
    if root:
        in_order(root.lchild)
        print(root.data, end=",")
        in_order(root.rchild)

in_order(root)  # ABCDEGF
print(" ")

# 后序遍历
def post_order(root):
    if root:
        post_order(root.lchild)
        post_order(root.rchild)
        print(root.data, end=",")

post_order(root)  # BDCAFGE
print(" ")

# 层次遍历
def level_order(root):
    queue = deque()  # 创建一个队列
    queue.append(root)
    while len(queue) > 0:  # 只要队不空
        node = queue.popleft()  # 出队
        print(node.data, end=",")  # 打印
        if node.lchild:  # 如果node的左孩子有
            queue.append(node.lchild)  # 那么就进队
        if node.rchild:
            queue.append(node.rchild)

level_order(root)  # EAGCFBD
复制代码

 

posted @   天才九少  阅读(26)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
点击右上角即可分享
微信分享提示