IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 二叉树遍历及变形 -> 正文阅读

[数据结构与算法]二叉树遍历及变形

1. 定义

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

2. 遍历

2.1 先序遍历

2.1.1 递归

def pre(node):
    if node is None:
        return
    print(node.val)
    pre(node.left)
    pre(node.right)

2.1.2 非递归

2.3 中序遍历

2.3.1 递归

def mid(node):
    if node is None:
        return
    mid(node.left)
    print(node.val)
    mid(node.right)

2.3.2 非递归

2.3 后序遍历

2.3.1 递归

def post(node):
    if node is None:
        return
    post(node.left)
    post(node.right)
    print(node.val)

2.3.2 非递归

2.4 测试

# 定义结点
node1 = TreeNode(1)
node2 = TreeNode(2)
node3 = TreeNode(3)
node4 = TreeNode(4)
node5 = TreeNode(5)
node6 = TreeNode(6)
node7 = TreeNode(7)
# 构建树
root = node1
root.left = node2
root.right = node3
node2.left = node4
node2.right = node5
node3.left = node6
node3.right = node7
print(------先序遍历(递归)------)
pre(root)
# 1 2 4 5 3 6 7
print(------中序遍历(递归)------)
mid(root)
# 4 2 5 1 6 3 7
print(------后序遍历(递归)------)
post(root)
# 4 5 2 6 7 3 1

3. 重建二叉树

只能由前中序或后中序才能重建二叉树(必须有中序遍历找到根结点所在位置)。

3.1 由前、中序遍历重建二叉树

def tree_by_pre_mid(pre, mid):
    if (len(pre) == 0) or (len(mid) == 0) or (len(pre) != len(mid)):
        return
    root = TreeNode(pre[0])
    # 在中序遍历中找到根结点位置
    i = mid.index(pre[0])
    root.left = tree_by_pre_mid(pre[1:i+1], mid[:i])
    root.right = tree_by_pre_mid(pre[i+1:], mid[i+1:])
    return root

3.2 由后、中序遍历重建二叉树

def tree_by_post_mid(post, mid):
    if (len(post) == 0) or (len(mid) == 0) or (len(post) != len(mid)):
        return
    root = TreeNode(post[-1])
    # 在中序遍历中找到根结点位置
    i = mid.index(post[-1])
    root.left = tree_by_post_mid(post[:i], mid[:i])
    # -1 不能省,否则结果不对
    root.right = tree_by_post_mid(post[i:-1], mid[i+1:])
    return root

3.3 测试

pre_order_list = [1, 2, 4, 5, 3, 6, 7]
mid_order_list = [4, 2, 5, 1, 6, 3, 7]
post_order_list = [4, 5, 2, 6, 7, 3, 1]
root = tree_by_pre_mid(pre_order_list, mid_order_list)
post(root)
# 4 5 2 6 7 3 1
root = tree_by_post_mid(post_order_list, mid_order_list)
pre(root)
# 1 2 4 5 3 6 7

4. 广度优先与深度优先遍历

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

4.2 深度优先遍历

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-03 11:27:45  更:2021-08-03 11:30:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 18:19:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码