首页 > 编程语言 >算法:实现中序遍历(3种方法图例详解,小白也能看懂)

算法:实现中序遍历(3种方法图例详解,小白也能看懂)

时间:2023-10-30 12:02:12浏览次数:45  
标签:right TreeNode 中序 tree 图例 能看懂 root self left


 中序遍历:左 -> 中 -> 右

练习地址:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

1、递归法 

算法:实现中序遍历(3种方法图例详解,小白也能看懂)_1024程序员节

# Definition for a binary tree node.
class TreeNode(object):
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right
        

class Solution(object):

    def dfs(self, root, res):
        if not root:
            return
        self.dfs(root.left, res)
        res.append(root.val)
        self.dfs(root.right, res)

    def inorderTraversal(self, root):
        res = []
        self.dfs(root, res)
        return res


if __name__ == '__main__':
    # 创建一个二叉树
    tree = TreeNode(1)
    tree.left = TreeNode(2)
    tree.right = TreeNode(3)
    tree.left.left = TreeNode(4)
    tree.left.right = TreeNode(5)
    tree.right.right = TreeNode(6)

    # 执行中序遍历
    sol = Solution()
    print(sol.inorderTraversal(tree))  # [4, 2, 5, 1, 3, 6]

2、迭代法

# Definition for a binary tree node.
class TreeNode(object):
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right


class Solution(object):

    def inorderTraversal(self, root):
        res = []
        stack = []
        while root or stack:
            while root:  # 先遍历完所有左节点,放入栈中
                stack.append(root)
                root = root.left
            root = stack.pop()  # 将当前节点出栈
            res.append(root.val)
            # 将右节点作为根节点重新开始遍历,直到 root 和 栈 都为空为止
            root = root.right  
        return res


if __name__ == '__main__':
    # 创建一个二叉树
    tree = TreeNode(1)
    tree.left = TreeNode(2)
    tree.right = TreeNode(3)
    tree.left.left = TreeNode(4)
    tree.left.right = TreeNode(5)
    tree.right.right = TreeNode(6)

    # 执行中序遍历
    sol = Solution()
    print(sol.inorderTraversal(tree))  # [4, 2, 5, 1, 3, 6]

3、Morris(莫里斯)遍历法

仔细看代码注释与图解,其实原理很简单。

算法:实现中序遍历(3种方法图例详解,小白也能看懂)_1024程序员节_02

# Definition for a binary tree node.
class TreeNode(object):
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

'''
主要思想:从上往下,把每一个节点与其右子树挂到左子树的最右边
该方法相比前两种方法,主要是节省了空间,空间复杂度从O(n)变成了O(1)
'''
class Solution(object):

    def inorderTraversal(self, root):
        res = []
        while root:
            if root.left:  # 如果当前节点存在左子树,则找到其最右边的子节点
                pre = root.left
                while pre.right:  # 找到其最右边的子节点
                    pre = pre.right
                # 把root赋值给temp,把temp的左子树设为空,挂到最右边那个子节点上去
                temp = root
                root = root.left  # 此时根结点被挂到子树上了,我们要变更根结点了,该操作不能放到 temp.left = None 后面,否则执行 temp.left = None 时 root.left 也会被置为空
                temp.left = None
                pre.right = temp
            else:
                res.append(root.val)  # 如果当前节点已经是最左边的节点了,则可以输出它的值,并开始遍历右子树了
                root = root.right
        return res


if __name__ == '__main__':
    # 创建一个二叉树
    tree = TreeNode(1)
    tree.left = TreeNode(2)
    tree.right = TreeNode(3)
    tree.left.left = TreeNode(4)
    tree.left.right = TreeNode(5)
    tree.right.left = TreeNode(6)

    # 执行中序遍历
    sol = Solution()
    print(sol.inorderTraversal(tree))  # [4, 2, 5, 1, 6, 3]

标签:right,TreeNode,中序,tree,图例,能看懂,root,self,left
From: https://blog.51cto.com/u_13946099/8087255

相关文章

  • 批量修改Fasta文件中序列的名称
    比如一个Fasta文件的内容如下:seq001|aaaATCGGGGseq002|bbbAAAATTTT删除序列名称中“|”后的内容,只保留seq001,seq002这样的名称点击查看代码#!/usr/bin/envpythonimportsysimportpysamwithpysam.FastxFile(sys.argv[1])asfh:forrinfh:new_n......
  • 94.二叉树的中序遍历
    1.题目介绍给定一个二叉树的根节点root,返回它的中序遍历。示例1:输入:root=[1,null,2,3]输出:[1,3,2]示例2:输入:root=[]输出:[]示例3:输入:root=[1]输出:[1]提示:树中节点数目在范围[0,100]内-100<=Node.val<=1002.题解2.1递归首先我们需......
  • 二叉树遍历(先序、中序、后序)
    学习二叉树遍历(先序、中序、后序)的相关方法二叉树有多种遍历方法,有层次遍历、深度优先遍历、广度优先遍历等。本文只涉及二叉树的先序、中序、后序的递归和非递归遍历。涉及到的代码都用Java编写,可了解其流程。首先给出二叉树节点类:树节点:classTreeNode{intval;......
  • Transformer一作来卷多模态!学术图表也能看懂,100毫秒极速响应|免费试玩
    前言 最近多模态大模型是真热闹啊。这不,Transformer一作携团队也带来了新作,一个规模为80亿参数的多模态大模型Fuyu-8B。而且发布即开源,模型权重在HuggingFace上可以看到。本文转载自量子位仅用于学术分享,若侵权请联系删除欢迎关注公众号CV技术指南,专注于计算机视觉的技术总结......
  • 初学Bokeh:添加&修改图例的样式 【11】跬步
    初学Bokeh:添加&修改图例的样式【11】跬步如果在调用渲染器函数时包含了legend_label属性,Bokeh会自动将一个图例添加到绘图中。例如:p.circle(x,y3,legend_label="Objects")从而为你绘制的图形添加一个带有“Objects”条目的图例。改变图例对象的属性可以对图例进行自定义......
  • 144-18 中序创建线索二叉树
    同理,先序创建线索二叉树只需要将InThread中的某部分调换位置死记硬背#include<stdio.h>#include<stdlib.h>typedefstructnode{intdata;structnode*lchild,*rchild;intlefttag,righttag;}TreeNode,*Tree;voidCreateTree(Tree&T)//先序......
  • python 中序列ID从fasta文件中批量提取序列数据
     001、[root@pc1test1]#lsa.fachr.listtest.py[root@pc1test1]#cata.fa##测试fasta文件>chr1tttcccggg>chr2tttgggccc>chr3cccttt>chr4aaaaattt[root@pc1test1]#catchr.list##序列IDchr2chr4 [root@pc1......
  • 根据先序序列和中序序列构造二叉树
    阅读本文之前希望读者可以先掌握如何根据先序序列和中序序列手动画出二叉树。所用二叉树数据结构如下:typedefstructTreeNode{ chardata; TreeNode*lchild,*rchild;}TreeNode,*Tree;该方法声明如下TreecreateTree(char*pre,intl1,intr1,char*in,intl2,intr2);......
  • 二叉树遍历(中序遍历)
    中序遍历,就是从最左边开始,把每个节点垂直投影到同一直线上,然后从左往右读值就可以了。口诀:先左再根再右......
  • 初中生都能看懂的 LCT 学习笔记
    初中生都能看懂的LCT学习笔记这篇文章偏向入门,旨在尽可能解决一类问题——动态树,主要讲述并且整理LCT算法及其一些变式。目前其变式例题作者还在整理之中,编者保证会把变式例题持续更新。0.前置知识splay。我可以猜测一下,你们可能看到splay,然后就可能去学了splay树,然......