当前位置: 首页 > news >正文

数据结构——【二叉树模版】

#思路

 1、二叉树不同于数的构建,在树节点类中,有数据,左子结点,右子节点三个属性,在树类的构造函数中,添加了变量maxNodes,用于后续列表索引的判断

2.GetTreeNode()函数是常用方法,用于获取不同节点的索引

3、Create()是重点,与树的区别在于,树的索引和节点值是自己设置的,而二叉树构建

树的过程,传入的主要参数是数组a,所以对应索引的节点值,需要根据二叉树索引特点自己构建

4、三种遍历过程,就是按照不同方式访问树的节点,以前序遍历为例,构建函数的过程就是访问当前节点的值(此功能由visit()完成),然后递归的访问左子结点和右子节点,如果深入递归的遍历过程,思维会混乱,不如明确递归函数书写的根本:

①这个函数功能是什么,完成这个功能

②递归的基本要求是,随着遍历的每一次深入,需要回来,因此需要一个判断,便于函数返回

③具备深搜的基本条件:每一个节点都有三个属性

索引作为节点的唯一标识符,在创建时会储存在一个顺序表中。

回到创建树的过程(create()过程),由传入参数可知,根节点的值和索引是确定的,当确定第一个节点值时,会继续对此节点添加左右子节点,而新连接成的节点(索引不同),他们也具有三个属性。所以实际上,这些节点依据索引的不同被访问和划分,每一个节点都有向下的枢纽,完成遍历过程。

class TreeNode:
    def __init__(self, val=None, left=None, right=None):
        self.val = val
        self.right = right
        self.left = left


class Tree:
    def __init__(self, maxNodes):
        self.root = None
        self.nodes = [TreeNode() for i in range(maxNodes)]
        self.nodesSize = maxNodes

    def GetTreeNode(self, id):
        return self.nodes[id]

    def visit(self, node):
        print(node.val, end="")

    def Create(self, a, size, nodeId):
        if nodeId >= size or a[nodeId] == None:
            return None
        nowNode = self.GetTreeNode(nodeId)
        nowNode.val = a[nodeId]
        nowNode.left = self.Create(a, size, nodeId * 2)
        nowNode.right = self.Create(a, size, nodeId * 2 + 1)
        return nowNode

    def CreateTree(self, a):
        self.root = self.Create(a, len(a), 1)

    def preOrder(self, node):
        if node:
            self.visit(node)
            self.preOrder(node.left)
            self.preOrder(node.right)

    def preOrederTraversal(self):
        self.preOrder(self.root)
        print("")

    def inOrder(self, node):
        if node:
            self.inOrder(node.left)
            self.visit(node)
            self.inOrder(node.right)

    def inOrederTraversal(self):
        self.inOrder(self.root)
        print("")

    def postOrder(self, node):
        if node:
            self.visit(node)
            self.postOrder(node.left)
            self.postOrder(node.right)

    def postOrederTraversal(self):
        self.postOrder(self.root)
        print("")


def Test():
    a = [None, "a", "b", "c", "d", None, "e", "f", "g", "h", None, None, None, None, "i"]
    T = Tree(15)
    T.CreateTree(a)
    T.postOrederTraversal()
    T.inOrederTraversal()
    T.postOrederTraversal()


Test()

http://www.dtcms.com/a/13652.html

相关文章:

  • vue项目使用vite和vue-router实现history路由模式空白页以及404问题
  • fetch() 与 XMLHttpRequest 的差异
  • AI知识库和全文检索的区别
  • C++设计模式 - 模板模式
  • 使用 Notepad++ 编辑显示 MarkDown
  • C# sealed 、GetType、序列化static
  • 【网络安全.渗透测试】Cobalt strike(CS)工具使用说明
  • 【状态空间方程】对于状态空间方程矩阵D≠0时的状态反馈与滑模控制
  • 细说STM32F407单片机RTC入侵检测和时间戳的原理及使用方法
  • 当没有OpenGL时,Skia如何绘制?
  • qt的QMainWindow保存窗口和恢复窗口状态
  • 《Stable Diffusion绘画完全指南:从入门到精通的Prompt设计艺术》 第一章
  • HCIA-路由器相关知识和面试问题
  • 《Performance Analysisi and Tuning on Modern CPU》阅读笔记
  • deepin linux UOS AI 使用 deepseek-r1 30B
  • git如何把多个commit合成一个
  • Jenkins 部署 之 Mac 一
  • 1 推荐系统概述
  • 【数据结构】(8) 二叉树
  • ES 索引结构
  • 优选驾考小程序
  • 如何优化数据库Update锁竞争
  • 直接调字典控制器传字典名称和字典Value查具体的字典Label
  • 【算法】动态规划专题⑫ —— 环形区间DP python
  • Flutter Gradle 命令式插件正式移除,你迁移旧版 Gradle 配置了吗?
  • 轻松打造专属音乐库:Alger Music本地部署与远程访问全流程解析
  • SQL 大厂面试题目(由浅入深)
  • 线性回归计算斜率原理及C++实现
  • OOM异常排除
  • 【DeepSeek】在本地计算机上部署DeepSeek-R1大模型实战(完整版)