广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python二叉树常用算法总结
  • 650
分享到

python二叉树常用算法总结

2024-04-02 19:04:59 650人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录1.1 二叉树的初始化1.2 创建一个二叉树1.3 前序遍历1.4 中序遍历1.5 后序遍历1.6 层序遍历1.7 计算节点数1.8 计算树的深度1.9 计算树的叶子树1.10

1.1 二叉树的初始化


#initial of BinaryTree
class BinaryTree:
    def __init__(self,rootObj):
        self.val = rootObj
        self.left = None
        self.right = None

    def insertLeft(self,newnode):
        if self.left == None:
            self.left = BinaryTree(newNode)
        else:
            t = BinaryTree(newNode)
            t.left = self.left
            self.left = t

    def insertRight(self,newNode):
        if self.right == None:
            self.right = BinaryTree(newNode)
        else:
            t = BinaryTree(newNode)
            t.right = self.right
            self.right = t

1.2 创建一个二叉树


#create a BinaryTree [18,7,11,3,4,5,6,#,#,#,#,1,3,2,4]
#  18
# 7  11
#3 4 5 6
#   1 3 2 4

root = BinaryTree(18)
root.left = BinaryTree(7)
root.right = BinaryTree(11)
root.left.left = BinaryTree(3)
root.left.right = BinaryTree(4)
root.right.left = BinaryTree(5)
root.right.right = BinaryTree(6)
root.right.left.left = BinaryTree(1)
root.right.left.right = BinaryTree(3)
root.right.right.left = BinaryTree(2)
root.right.right.right = BinaryTree(4)

1.3 前序遍历


#递归版本
def PreOrder(self, node):
    if node:
        print(node.val)
        self.PreOrder(node.left)
        self.PreOrder(node.right)
#循环版本
def PreOrderLoop(self, node):
    if node == None:
        return
    stack =[]
    print(node.val)
    stack.append(node)
    node = node.left
    while stack!=[] or node:
        while node:
            print(node.val)
            stack.append(node)
            node = node.left
        node = stack[-1].right
        stack.pop()

#ouput: 18 7 3 4 11 5 1 3 6 2 4 

1.4 中序遍历


#递归版本
def InOrder(self, node):
    if node:
        self.InOrder(node.left)
        print(node.val)
        self.InOrder(node.right)
#循环版本
def InOrderLoop(self, node):
    if node == None:
        return None
    stack = []
    stack.append(node)
    node = node.left
    while stack!=[] or node:
        while node:
            stack.append(node)
            node = node.left
        print(stack[-1].val)
        node = stack[-1].right
        stack.pop()
#output:3 7 4 18 1 5 3 11 2 6 4

1.5 后序遍历


#递归
def PostOrder(self, node):
    if node:
        self.PostOrder(node.left)
        self.PostOrder(node.right)
        print(node.val)
#非递归
def PostOrderLoop(self, node):
    if node == None:
        return
    stack =[]
    stack.append(node)
    pre = None
    while stack!=[]:
        node = stack[-1]
        if ((node.left==None and node.right==None) or
                (pre and (pre == node.left or pre ==node.right))):
            print(node.val)
            pre = node
            stack.pop()
        else:
            if node.right:
                stack.append(node.right)
            if node.left:
                stack.append(node.left)
#output:3 4 7 1 3 5 2 4 6 11 18

1.6 层序遍历


def LevelOrder(self, node):
    if node == None:
        return
    stack = []
    stack.append(node)
    while stack!=[]:
        node = stack[0]
        if node.left:
            stack.append(node.left)
        if node.right:
            stack.append(node.right)
        print(node.val)
        stack.pop(0)
output: 18 7 11 3 4 5 6 1 3 2 4

1.7 计算节点数


#递归版本
def CountNode(self, root):
    if root == None:
        return 0
    return self.CountNode(root.left) + self.CountNode(root.right) + 1
#非递归版本
def CountNodeNotRev(self, root):
    if root == None:
        return 0
    stack = []
    stack.append(root)
    index = 0
    while index<len(stack):
        if stack[index].left:
            stack.append(stack[index].left)
        if stack[index].right:
            stack.append(stack[index].right)
        index += 1
    print(len(stack))
output: 11

1.8 计算树的深度


def getTreeDepth(self, root):
    if root == None:
        return 0
    left = self.getTreeDepth(root.left) + 1
    right = self.getTreeDepth(root.right) + 1
    return left if left>right else right

1.9 计算树的叶子树


def countLeaves(self, root):
    if root == None:
        return 0
    if root.left==None and root.right==None:
        return 1
    return self.countLeaves(root.left)+self.countLeaves(root.right)

1.10 获取第K层节点数


def getKLevel(self, root, K):
    if root == None: return 0
    if K == 1: return 1
    return self.getKLevel(root.left, K-1)+self.getKLevel(root.right, K-1)

1.11 判断两颗二叉树是否相同


def StrucCmp(self, root1, root2):
    if root1 == None and root2 == None: return True
    elif root1 ==None or root2 == None: return False
    return self.StrucCmp(root1.left, root2.left) and self.StrucCmp(root1.right, root2.right)

1.12 二叉树的镜像


def Mirror(self, root):
    if root == None: return
    tmp = root.left
    root.left = root.right
    root.right = tmp
    self.Mirror(root.left)
    self.Mirror(root.right)

1.13 找最低公共祖先节点


def findLCA(self, root, node1, node2):
    if root == None: return
    if root == node1 or root == node2: return root
    left = self.findLCA(root.left, node1, node2)
    right = self.findLCA(root.right, node1, node2)
    if left and right:
        return root
    return left if left else right

1.14 获取两个节点的距离


def getDist(self, root, node1, node2):
    lca = self.findLCA(root, node1, node2) #找最低公共祖宗节点
    level1 = self.FindLevel(lca, node1) #祖节点到两个节点的距离
    level2 = self.FindLevel(lca, node2)
    return level1+level2
def FindLevel(self, node, target):
    if node == None: return -1
    if node == target: return 0
    level = self.FindLevel(node.left, target)
    if level == -1: level = self.FindLevel(node.right, target)
    if level != -1: return level + 1
    return -1

1.15 找一个节点的所有祖宗节点


def findAllAncestor(self, root, target):
    if root == None: return False
    if root == target: return True
    if self.findAllAncestor(root.left, target) or self.findAllAncestor(root.right, target):
        print(root.val)
        return True
    return False

到此这篇关于python二叉树常用算法总结的文章就介绍到这了,更多相关Python二叉树常用算法,内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: python二叉树常用算法总结

本文链接: https://www.lsjlt.com/news/136897.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • python二叉树常用算法总结
    目录1.1 二叉树的初始化1.2 创建一个二叉树1.3 前序遍历1.4 中序遍历1.5 后序遍历1.6 层序遍历1.7 计算节点数1.8 计算树的深度1.9 计算树的叶子树1.10 ...
    99+
    2022-11-12
  • Python二叉树的定义及常用遍历算法分析
    本文实例讲述了Python二叉树的定义及常用遍历算法。分享给大家供大家参考,具体如下: 说起二叉树的遍历,大学里讲的是递归算法,大多数人首先想到也是递归算法。但作为一个有理想有追求的程序员。也应该学学非递归...
    99+
    2022-06-04
    遍历 算法 定义
  • Python实现二叉树结构与进行二叉树遍历的方法详解
    二叉树的建立 使用类的形式定义二叉树,可读性更好 class BinaryTree: def __init__(self, root): self.key = root sel...
    99+
    2022-06-04
    二叉树 遍历 详解
  • JavaScript数据结构与算法之二叉树插入节点、生成二叉树的示例分析
    小编给大家分享一下JavaScript数据结构与算法之二叉树插入节点、生成二叉树的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解...
    99+
    2022-10-19
  • Java 二叉树遍历的常用方法
    目录递归方式非递归方式层次遍历总结采用前序遍历、中序遍历、后续遍历实现时,即便采用不同的实现方式(递归方式、非递归),它们的算法结构是有很大的相似性。因而针对前三种的遍历我们会总结出...
    99+
    2022-11-12
  • 带你了解Java数据结构和算法之二叉树
    目录1、树2、二叉树3、查找节点4、插入节点5、遍历树6、查找最大值和最小值7、删除节点  ①、删除没有子节点的节点②、删除有一个子节点的节点③、删除有两个子节点的节点④、删除有必要...
    99+
    2022-11-13
  • 如何实现数据结构中的二叉树遍历算法
    今天就跟大家聊聊有关如何实现数据结构中的二叉树遍历算法,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。今天咱们来看一种新...
    99+
    2022-10-19
  • Python算法之求n个节点不同二叉树个数
    问题 创建一个二叉树 二叉树有限多个节点的集合,这个集合可能是: 空集 由一个根节点,和两棵互不相交的,分别称作左子树和右子树的二叉树组成 创建二叉树: 创建节点 再创建节点之间的关系 Py...
    99+
    2022-06-05
    节点 算法 个数
  • 如何使用C语言实现平衡二叉树数据结构算法
    目录前言一、平衡二叉树实现原理二、平衡二叉树实现算法三、全部代码前言 对于一个二叉排序树而言 它们的结构都是根据了二叉树的特性从最左子树开始在回到该结点上继续往右结点走 ...
    99+
    2022-11-12
  • C语言 超详细总结讲解二叉树的概念与使用
    目录1.二叉树的概念及结构 2.二叉树链式结构的实现1.二叉树的概念及结构  ①概念:一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵别...
    99+
    2022-11-13
  • JavaMorris遍历算法及其在二叉树中的应用
    目录一.Morris遍历1.什么是Morris遍历2.基本思想3.Morris遍历的优点和缺点4.二叉树的线索化二.中序Morris遍历1.中序Morris遍历的分析2.中序Morr...
    99+
    2023-05-18
    Java Morris遍历算法 Java Morris遍历
  • Java中二叉树遍历的常用方法有哪些
    这篇文章给大家分享的是有关Java中二叉树遍历的常用方法有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。采用前序遍历、中序遍历、后续遍历实现时,即便采用不同的实现方式(递归方式、非递归),它们的算法结构是有很...
    99+
    2023-06-15
  • Python利用前序和中序遍历结果重建二叉树的方法
    本文实例讲述了Python利用前序和中序遍历结果重建二叉树的方法。分享给大家供大家参考,具体如下: 题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含...
    99+
    2022-06-04
    遍历 方法 二叉树
  • 利用JS实现二叉树遍历算法实例代码
    目录前言 一、二叉树 1.1、遍历二叉树 1.2、用js表示二叉树 1.3、前序遍历算法 1.4、中序遍历算法 1.5、后序遍历算法 1.6、按层遍历算法 二、算法题 1.1、二叉树...
    99+
    2022-11-12
  • 8种Python异常检测算法总结
    目录一、异常检测简介1.1 异常检测适用的场景1.2 异常检测存在的挑战二、异常检测方法2.1 基于聚类的方法2.2 基于统计的方法2.3 基于深度的方法2.4 基于分类模型2.5 ...
    99+
    2023-02-06
    Python异常检测算法 Python异常检测
  • 教你如何使用Python实现二叉树结构及三种遍历
    一:代码实现 class TreeNode: """节点类""" def __init__(self, mid, left=None, right=None): ...
    99+
    2022-11-12
  • 总结Python常用的魔法方法
    目录一、算数运算符的魔法方法二、反运算相关的魔法方法三、增量赋值运算四、一元操作符一、算数运算符的魔法方法 python2.2以后,对类和类型进行了统一,做法就是讲int(...
    99+
    2022-11-12
  • Java常用加密算法实例总结
    本文实例总结了Java常用加密算法。分享给大家供大家参考,具体如下:项目中第一次深入地了解到加密算法的使用,现第一阶段结束,将使用到的加密算法和大家分享一下:首先还是先给大家普及一下常用加密算法的基础知识基本的单向加密算法BASE64 严格...
    99+
    2023-05-31
    java 加密 算法
  • python Pool常用函数用法总结
    1、说明 apply_async(func[,args[,kwds]):使用非堵塞调用func(并行执行,堵塞方式必须等待上一个过程退出才能执行下一个过程),args是传输给func...
    99+
    2022-11-12
  • Java算法比赛常用方法实例总结
    1. 开方:Math.sqrt(x); 2. x的a方:Math.pow(x,a); 3. 绝对值:Math.abs(x); 4. BigInteger:大数(加,减,乘,除,取余)...
    99+
    2023-05-19
    java的算法 java基本算法 java经典算法
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作