算法--解决二叉树遍历问题

第一 实现树的结构

class Node():

构造函数,初始化节点对象,包含数据和左右子节点

def init(self, data=None):

self.data = data # 节点存储的数据

self.left = None # 左子节点,默认为None

self.right = None # 右子节点,默认为None

设置节点数据的方法

def set_data(self, data):

self.data = data # 将传入的数据赋值给节点的data属性

获取节点数据的方法

def get_data(self):

return self.data # 返回节点的data属性

设置左子节点的方法

def set_left(self, node):

self.left = node # 将传入的节点赋值给当前节点的left属性

获取左子节点的方法

def get_left(self):

return self.left # 返回当前节点的left属性,即左子节点

设置右子节点的方法

def set_right(self, node):

self.right = node # 将传入的节点赋值给当前节点的right属性

获取右子节点的方法

def get_right(self):

return self.right # 返回当前节点的right属性,即右子节点

if name == 'main':

创建根节点,数据为'a'

root_node = Node('a')

创建左子节点,数据为'b'

left_node = Node('b')

创建右子节点,数据为'c'

right_node = Node('c')

将左子节点设置到根节点的左子节点位置

root_node.set_left(left_node)

将右子节点设置到根节点的右子节点位置

root_node.set_right(right_node)

打印根节点的数据,左子节点的数据和右子节点的数据

print(root_node.get_data(), root_node.get_left().data, root_node.get_right().data)

第二 二叉树递归遍历

复制代码
#实现树的递归遍历(前、中、后以及层次的遍历),首先定义实现树结构的类Node。编写三个函数proorderO)、posorder0)和mid order0)分别实现先序遍历后序遍历和中序遍历。

from collections import deque

class Node():
    # 构造函数,初始化节点对象,包含数据和左右子节点
    def __init__(self, data=None, left=None, right=None):
        self.data = data  # 节点存储的数据
        self.left = left  # 左子节点,默认为None
        self.right = right  # 右子节点,默认为None

    # 前序遍历:先访问根节点,然后递归遍历左子树,最后递归遍历右子树
    def pro_order(self):
        print(self.data)  # 访问根节点
        if self.left:  # 如果存在左子节点,则递归遍历左子树
            self.left.pro_order()
        if self.right:  # 如果存在右子节点,则递归遍历右子树
            self.right.pro_order()

    # 中序遍历:先递归遍历左子树,然后访问根节点,最后递归遍历右子树
    def mid_order(self):
        if self.left:  # 如果存在左子节点,则递归遍历左子树
            self.left.mid_order()
        print(self.data)  # 访问根节点
        if self.right:  # 如果存在右子节点,则递归遍历右子树
            self.right.mid_order()

    # 后序遍历:先递归遍历左子树,然后递归遍历右子树,最后访问根节点
    def pos_order(self):
        if self.left:  # 如果存在左子节点,则递归遍历左子树
            self.left.pos_order()
        if self.right:  # 如果存在右子节点,则递归遍历右子树
            self.right.pos_order()
        print(self.data)  # 访问根节点

    # 层序遍历:使用队列按层次顺序访问节点
    def row_order(self):
        queue = deque([self])  # 初始化队列,将根节点加入队列
        while queue:  # 当队列不为空时,进行遍历
            current_tree = queue.popleft()  # 从队列前端取出节点
            print(current_tree.data)  # 访问节点
            if current_tree.left is not None:  # 如果存在左子节点,则加入队列
                queue.append(current_tree.left)
            if current_tree.right is not None:  # 如果存在右子节点,则加入队列
                queue.append(current_tree.right)

    # 自定义遍历:使用栈按特定顺序访问节点
    def custom_order(self):
        stack = [self]  # 初始化栈,将根节点加入栈
        while stack:  # 当栈不为空时,进行遍历
            node = stack.pop()  # 从栈末端取出节点
            print(node.data)  # 访问节点
            if node.right is not None:  # 如果存在右子节点,则加入栈
                stack.append(node.right)
            if node.left is not None:  # 如果存在左子节点,则加入栈
                stack.append(node.left)

# 主程序入口
if __name__ == '__main__':
    # 创建二叉树
    tree = Node('A', Node('B', Node('D'), Node('E')), Node('C', Node('F'), Node('G')))
    print("自定义遍历:")
    tree.custom_order()  # 执行自定义遍历

返回结果:

第一

第二

相关推荐
摸鱼仙人~22 分钟前
深入理解 MyBatis-Plus 的 `BaseMapper`
java·开发语言·mybatis
CoovallyAIHub22 分钟前
SBP-YOLO:面向嵌入式悬架的轻量实时模型,实现减速带与坑洼高精度检测
深度学习·算法·计算机视觉
ITKEY_1 小时前
flutter日期选择国际化支持
开发语言·javascript·flutter
CoovallyAIHub1 小时前
医药、零件、饮料瓶盖……SuperSimpleNet让质检“即插即用”
深度学习·算法·计算机视觉
dragoooon341 小时前
[优选算法专题二滑动窗口——串联所有单词的子串]
数据结构·c++·学习·算法·leetcode·学习方法
刃神太酷啦1 小时前
C++ 异常处理机制:从基础到实践的全面解析----《Hello C++ Wrold!》(20)--(C/C++)
java·c语言·开发语言·c++·qt·算法·leetcode
蓝倾9761 小时前
小红书获取用户作品列表API接口操作指南
java·服务器·前端·python·电商开放平台·开放api接口
q567315231 小时前
告别低效:构建健壮R爬虫的工程思维
开发语言·爬虫·r语言
枫叶丹41 小时前
【Qt开发】显示类控件(一)-> QLabel
开发语言·qt
Python私教2 小时前
源滚滚Rust全栈班v1.02 无符号整数详解
开发语言·后端·rust