Python实现二叉树的算法实例

本篇文章给大家带来的内容是关于Python实现二叉树的算法实例,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

节点定义

class Node(object):    def __init__(self, left_child, right_child, value):        self._left_child = left_child        self._right_child = right_child        self._value = value    @property    def left_child(self):        return self._left_child    @property    def right_child(self):        return self._right_child    @left_child.setter    def left_child(self, value):        self._left_child = value    @right_child.setter    def right_child(self, value):        self._right_child = value    @property    def value(self):        return self._value    @value.setter    def value(self, value):        self._value = value

登录后复制

二叉树定义

class Tree(object):    def __init__(self, value):        self._root = Node(None, None, value=value)    @property    def root(self):        return self._root

登录后复制

先序遍历

递归方式

'''先序遍历,递归方式'''def preoder(root):    if not isinstance(root, Node):        return None    preorder_res = []    if root:        preorder_res.append(root.value)        preorder_res += preoder(root.left_child)        preorder_res += preoder(root.right_child)    return preorder_res

登录后复制

非递归方式

'''先序遍历,非递归方式'''def pre_order_not_recursion(root):    if not isinstance(root, Node):        return None    stack = [root]    result = []    while stack:        node = stack.pop(-1)        if node:            result.append(node.value)            stack.append(node.right_child)            stack.append(node.left_child)    return result

登录后复制

中序遍历

递归方式

'''中序遍历,递归方式'''def middle_order(root):    if not isinstance(root, Node):        return None    middle_res = []    if root:        middle_res += middle_order(root.left_child)        middle_res.append(root.value)        middle_res += middle_order(root.right_child)    return middle_res

登录后复制

非递归方式

'''中序遍历,非递归方式'''def middle_order_bot_recursion(root):    if not isinstance(root, Node):        return None    result = []    stack = [root.right_child, root.value, root.left_child]    while stack:        temp = stack.pop(-1)        if temp:            if isinstance(temp, Node):                stack.append(temp.right_child)                stack.append(temp.value)                stack.append(temp.left_child)            else:                result.append(temp)    return result

登录后复制

后序遍历

递归方式

'''后序遍历,递归方式'''def post_order(root):    if not isinstance(root, Node):        return None    post_res = []    if root:        post_res += post_order(root.left_child)        post_res += post_order(root.right_child)        post_res.append(root.value)    return post_res

登录后复制

非递归方式

'''后序遍历,非递归方式'''def post_order_not_recursion(root):    if not isinstance(root, Node):        return None    stack = [root.value, root.right_child, root.left_child]    result = []    while stack:        temp_node = stack.pop(-1)        if temp_node:            if isinstance(temp_node, Node):                stack.append(temp_node.value)                stack.append(temp_node.right_child)                stack.append(temp_node.left_child)            else:                result.append(temp_node)    return result

登录后复制

分层遍历

'''分层遍历,使用队列实现'''def layer_order(root):    if not isinstance(root, Node):        return None    queue = [root.value, root.left_child, root.right_child]    result = []    while queue:        temp = queue.pop(0)        if temp:            if isinstance(temp, Node):                queue.append(temp.value)                queue.append(temp.left_child)                queue.append(temp.right_child)            else:                result.append(temp)    return result

登录后复制

计算二叉树结点个数

'''计算二叉树结点个数,递归方式NodeCount(root) = NodeCount(root.left_child) + NodeCount(root.right_child)'''def node_count(root):    if root and not isinstance(root, Node):        return None    if root:        return node_count(root.left_child) + node_count(root.right_child) + 1    else:        return 0'''计算二叉树结点个数,非递归方式借用分层遍历计算'''def node_count_not_recursion(root):    if root and not isinstance(root, Node):        return None    return len(layer_order(root))

登录后复制

计算二叉树深度

'''计算二叉树深度,递归方式tree_deep(root) = 1 + max(tree_deep(root.left_child), tree_deep(root.right_child))'''def tree_deep(root):    if root and not isinstance(root, Node):        return None    if root:        return 1 + max(tree_deep(root.left_child), tree_deep(root.right_child))    else:        return 0'''计算二叉树深度,非递归方法同理参考分层遍历的思想'''def tree_deep_not_recursion(root):    if root and not isinstance(root, Node):        return None    result = 0    queue = [(root, 1)]    while queue:        temp_node, temp_layer = queue.pop(0)        if temp_node:            queue.append((temp_node.left_child, temp_layer+1))            queue.append((temp_node.right_child, temp_layer+1))            result = temp_layer + 1    return result-1

登录后复制

计算二叉树第k层节点个数

'''计算二叉树第k层节点个数,递归方式kth_node_count(root, k) = kth_node_count(root.left_count, k-1) + kth_node_count(root.right_count, k-1)'''def kth_node_count(root, k):    if root and not isinstance(root, Node):        return None    if not root or k <= 0:        return 0    if k == 1:        return 1    return kth_node_count(root.left_child, k-1) + kth_node_count(root.right_child, k-1)'''计算二叉树第K层节点个数,非递归方式'''def kth_node_count_not_recursion(root, k):    if root and not isinstance(root, Node):        return None    if not root or k  k:                return result            else:                queue.append((temp_node.left_child, temp_layer+1))                queue.append((temp_node.right_child, temp_layer+1))    return result

登录后复制

计算二叉树叶子节点个数

'''计算二叉树叶子节点个数,递归方式关键点是叶子节点的判断标准,左右孩子皆为None'''def leaf_count(root):    if root and not isinstance(root, Node):        return None    if not root:        return 0    if not root.left_child and not root.right_child:        return 1    return leaf_count(root.left_child) + leaf_count(root.right_child)

登录后复制

判断两个二叉树是不是相同

'''判断两个二叉树是不是相同,递归方式isSame(root1, root2) = (root1.value == root2.value)                    and isSame(root1.left, root2.left)                     and isSame(root1.right, root2.right)'''def is_same_tree(root1, root2):    if not root1 and not root2:        return True    if root1 and root2:        return (root1.value == root2.value) and                is_same_tree(root1.left_child, root2.left_child) and                is_same_tree(root1.right_child, root2.right_child)    else:        return False

登录后复制

判断是否为二分查找树BST

'''判断是否为二分查找树BST,递归方式二分查找树的定义搞清楚,二分查找树的中序遍历结果为递增序列'''def is_bst_tree(root):    if root and not isinstance(root, Node):        return None    def is_asc(order):        for i in range(len(order)-1):            if order[i] > order[i+1]:                return False        return True    return is_asc(middle_order_bot_recursion(root))

登录后复制

测试方法

if __name__ == "__main__":    tree = Tree(1)    tree1 = Tree(1)    node6 = Node(None, None, 7)    node5 = Node(None, None, 6)    node4 = Node(None, None, 5)    node3 = Node(None, None, 4)    node2 = Node(node5, node6, 3)    node1 = Node(node3, node4, 2)    tree.root.left_child = node1    tree.root.right_child = node2    tree1.root.left_child = node2    tree1.root.right_child = node2    print(is_bst_tree(tree.root))

登录后复制

以上就是Python实现二叉树的算法实例的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2533931.html

(0)
上一篇 2025年3月5日 21:23:18
下一篇 2025年3月5日 21:23:27

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 怎么找到黑客的联系方式?

    如果你想要找到黑客的联系方式,那么你可能面临以下难题:黑客往往会隐藏他们的身份,并且他们的联系方式很难被发现。php小编草莓在这里为你提供了一份指南,旨在帮助你找到黑客的联系方式。在本指南中,我们将介绍一些常见的黑客使用的联系方式,并提供一…

    2025年3月5日
    200
  • Python装饰器的详细用法介绍(代码示例)

    本篇文章给大家带来的内容是关于python装饰器的详细用法介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 在Python中,装饰器一般用来修饰函数,实现公共功能,达到代码复用的目的。在函数定义前加上@xxx…

    编程技术 2025年3月5日
    000
  • python中的id()函数及读取list的方法介绍(代码示例)

    本篇文章给大家带来的内容是关于python中的id()函数及读取list的方法介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 id(object) return the “identity” of an o…

    编程技术 2025年3月5日
    200
  • python如何处理excel数据

    python处理excel数据的方法:1、使用xlrd来处理;2、使用【xlutils+xlrd】来处理;3、使用xlwt来处理;4、使用pyExcelerator来处理;5、使用Pandas库来处理。 这里有一张excel数据表,下面我们…

    2025年3月5日
    200
  • Python中数据类型时间的介绍(附代码)

    本篇文章给大家带来的内容是关于Python中数据类型时间的介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 1、什么是时间数据类型 python中表示时间类型的数据结构为时间数据类型; 2.time模块 imp…

    编程技术 2025年3月5日
    200
  • python使用PyQt5的详细教程(代码示例)

    本篇文章给大家带来的内容是关于python使用pyqt5的详细教程(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 一:安装PyQt5 pip install pyqt5 登录后复制 二:PyQt5简单使用 1:…

    2025年3月5日 编程技术
    200
  • Python数据类型之元组的详细介绍

    本篇文章给大家带来的内容是关于Python数据类型之元组的详细介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 1、元组的概念 python中的元组是有序元素组成的集合,与列表的区别在于,元组是不可变的,一旦定义,就不能…

    编程技术 2025年3月5日
    200
  • Python如何合并两个字典?(代码示例)

    通过在python中使用各种函数和构造函数,可以通过多种方式合并字典。下面本篇文章就来给大家介绍如何使用update()方法或**来合并字典,希望对大家有所帮助。 方法一:使用update()方法 通过在Python中使用update()方…

    2025年3月5日
    200
  • Python如何将字典键和值拆分为单独的列表?(代码示例)

    在python中如何将给定字典拆分为键和值的列表?下面本篇文章就来给大家介绍几种实现方法,希望对大家有所帮助。【视频教程推荐:python教程】 方法一:使用内置函数:keys()和values() keys()函数:能以列表的形式返回一个…

    2025年3月5日 编程技术
    200
  • python常用命令有哪些

    Python常用的命令有:1、打开csv文件;2、数据重新排序【dataframe index】;3、求标准差;4、向上取整;5、希尔伯特变换;6、dataframe修改列名;7、按照某一列进行升序或者降序排列等等。 【推荐课程:Pytho…

    2025年3月5日
    200

发表回复

登录后才能评论