数据结构之二叉树:二叉查找树的先序、中序、后序、层序遍历,Python代码实现——10(续)

数据结构之二叉查找树的代码实现

本节继续对上一节BST的功能实现
在实现之前,先对要实现的功能进行一下简单的介绍

BST的几种常见遍历方式

以一个简化的树为例,一棵树包含根(父)结点和其左子树及右子树:
在这里插入图片描述
遍历顺序的先后是指根(父)结点被遍历的相对顺序

  1. 先序遍历:指的是“先根后左再右”
  2. 中序遍历:指的是“先左后根再右”
  3. 后序遍历:指的是“先左后又再根”

如果子树也存在子树,则也需按此规则进行遍历,一般是递归地进行遍历
在这里插入图片描述
4. 层序遍历:指按树层次顺序,从根结点往下,子结点从左到右地遍历

在这里插入图片描述
5. 获取树的最大深度

  • 实现步骤(使用递归):
    1.如果根结点为空,则最大深度为0 ;
    2.计算左子树的最大深度;
    3.计算右子树的最大深度;
    4.当前树的最大深度=左子树的最大深度和右子树的最大深度中的较大者+1

接下来对BST的这些遍历功能进行实现

实现功能
  1. pre_ergodic()实现BST的先序遍历,返回遍历的元素组成的列表
  2. mid_ergodic()实现BST的中序遍历,返回遍历的元素组成的列表
  3. post_ergodic()实现BST的后序遍历,返回遍历的元素组成的列表
  4. layer_ergodic()实现BST的层序遍历,返回遍历的元素组成的列表
  5. max_depth()获取树的最大深度

Python代码实现

注:注释的测试代码是前一节的实现,可以忽略

import operator


class Node:
    def __init__(self, key=None, value=None):
        self.key = key
        self.value = value
        self.left = None
        self.right = None


class BinarySearchTree:
    def __init__(self):
        self.root = None
        self.len = 0

    def size(self):
        return self.len

    def put(self, _key, _value):
        """Put an element into this tree and generate a new BST"""
        def put_into(node, _key, _value):
            """Adjust position of new inserted node
            by BST character:left > root > right"""
            if not node:
                self.len += 1
                return Node(_key, _value)
            if operator.lt(_key, node.key):
                node.left = put_into(node.left, _key, _value)
            elif operator.gt(_key, node.key):
                node.right = put_into(node.right, _key, _value)
            elif operator.eq(_key, node.key):
                node.value = _value
            return node
        self.root = put_into(self.root, _key, _value)
        return self.root

    def get(self, _key):
        """Get a value responding to the given _key from this tree"""
        def get_value_by_key(node, _key):
            if not node:
                return
            if operator.lt(_key, node.key):
                return get_value_by_key(node.left, _key)
            elif operator.gt(_key, node.key):
                return get_value_by_key(node.right, _key)
            else:
                return node.value
        return get_value_by_key(self.root, _key)
    #
    # def delete(self, _key):
    #     """Delete a node responding to the giving key(_key)"""
    #     def delete_value_by_key(node, _key):
    #         if not node:
    #             return
    #         if operator.lt(_key, node.key):
    #             node.left = delete_value_by_key(node.left, _key)
    #         elif operator.gt(_key, node.key):
    #             node.right = delete_value_by_key(node.right, _key)
    #         else:
    #             self.len -= 1
    #             to_delete_node = node
    #             if node == self.root:
    #                 self.root = None
    #                 return
    #             # node = None
    #             if not to_delete_node.left:
    #                 return to_delete_node.right
    #             elif not to_delete_node.right:
    #                 return to_delete_node.left
    #             else:
    #                 min_right_tree = to_delete_node.right
    #                 pre = min_right_tree
    #                 while min_right_tree.left:
    #                     pre = min_right_tree
    #                     min_right_tree = min_right_tree.left
    #                 pre.left = None
    #                 min_right_tree.left = to_delete_node.left
    #                 min_right_tree.right = to_delete_node.right
    #                 return min_right_tree
    #     return delete_value_by_key(self.root, _key)
    #
    # def min_key(self):
    #     """Find the minimum key"""
    #     def min_node(node):
    #         while node.left:
    #             node = node.left
    #         return node
    #     return min_node(self.root).key
    #
    # def max_key(self):
    #     """Find the maximum key"""
    #     def max_node(node):
    #         while node.right:
    #             node = node.right
    #         return node
    #     return max_node(self.root).key

    def pre_ergodic(self):
        """Get every key of this tree, pre_ergodic; Return a list of its keys"""
        def pre_ergodic(node, keys_list):
            """Root --> Left --> Right"""
            if not node:
                return
            keys_list.append(node.key)
            if node.left:
                pre_ergodic(node.left, keys_list)
            if node.right:
                pre_ergodic(node.right, keys_list)
        keys_list = []
        pre_ergodic(self.root, keys_list)
        return keys_list

    def mid_ergodic(self):
        def mid_ergodic(node, keys_list):
            """Left --> Root --> Right"""
            if not node:
                return
            if node.left:
                mid_ergodic(node.left, keys_list)
            keys_list.append(node.key)
            if node.right:
                mid_ergodic(node.right, keys_list)

        keys_list = []
        mid_ergodic(self.root, keys_list)
        return keys_list

    def post_ergodic(self):
        def post_ergodic(node, keys_list):
            """Left --> Right --> Root"""
            if not node:
                return
            if node.left:
                post_ergodic(node.left, keys_list)
            if node.right:
                post_ergodic(node.right, keys_list)
            keys_list.append(node.key)
        keys_list = []
        post_ergodic(self.root, keys_list)
        return keys_list

    def layer_ergodic(self):
        """Root-->Left --> Right"""
        queue = [self.root]
        keys = []
        while queue:
            node = queue.pop(0)
            keys.append(node.key)
            if node.left:
                queue.append(node.left)
            if node.right: 
                queue.append(node.right)
        return keys

    def max_depth(self):
        """Get the max depth of this tree"""
        def max_depth(node):
            max_left, max_right = 0, 0
            if not node:
                return 0
            if node.left:
                max_left = max_depth(node.left)
            if node.right:
                max_right = max_depth(node.right)
            return max(max_left, max_right) + 1
        return max_depth(self.root)

代码测试
if __name__ == '__main__':
    BST = BinarySearchTree()

    BST.put('e', '5')
    BST.put('b', '2')
    BST.put('g', '7')
    BST.put('a', '1')
    BST.put('d', '4')
    BST.put('f', '6')
    BST.put('h', '8')
    BST.put('c', '3')
    print(f"The size of this binary tree now is {BST.size()}\n")

    print("pre_order:\n", [(key, BST.get(key)) for key in BST.pre_ergodic()])
    print("mid_order:\n", [(key, BST.get(key)) for key in BST.mid_ergodic()])
    print("post_order:\n", [(key, BST.get(key)) for key in BST.post_ergodic()])
    print("layer_order:\n", [(key, BST.get(key)) for key in BST.layer_ergodic()])
    print(f"Get the maximum depth of this tree: {BST.max_depth()}")
测试结果
The size of this binary tree now is 8

pre_order:
 [('e', '5'), ('b', '2'), ('a', '1'), ('d', '4'), ('c', '3'), ('g', '7'), ('f', '6'), ('h', '8')]
mid_order:
 [('a', '1'), ('b', '2'), ('c', '3'), ('d', '4'), ('e', '5'), ('f', '6'), ('g', '7'), ('h', '8')]
post_order:
 [('a', '1'), ('c', '3'), ('d', '4'), ('b', '2'), ('f', '6'), ('h', '8'), ('g', '7'), ('e', '5')]
layer_order:
 [('e', '5'), ('b', '2'), ('g', '7'), ('a', '1'), ('d', '4'), ('f', '6'), ('h', '8'), ('c', '3')]
Get the maximum depth of this tree: 4

Process finished with exit code 0

在这里插入图片描述
根据前/后序+中序确定这颗二叉查找树:
在这里插入图片描述
最大深度显然是4

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二叉链实现二叉树先序中序后序遍历操作的具体步骤如下: 1. 定义二叉树节点类,包含节点值、左右子节点等属性。 2. 根据输入的前序序列和中序序列构建二叉树。具体步骤如下: 1. 前序序列的第一个元素为根节点,将其在中序序列中找到对应位置,左边为左子树的中序序列,右边为右子树的中序序列。 2. 根据左子树的中序序列长度,在前序序列中找到左子树的前序序列,右边为右子树的前序序列。 3. 递归构建左子树和右子树。 3. 实现先序遍历、中序遍历和后序遍历函数。具体步骤如下: 1. 先序遍历:先输出当前节点的值,再递归遍历左子树和右子树。 2. 中序遍历:先递归遍历左子树,再输出当前节点的值,最后递归遍历右子树。 3. 后序遍历:先递归遍历左子树和右子树,最后输出当前节点的值。 4. 统计二叉树的叶子数。具体步骤如下: 1. 如果当前节点为空,则返回0。 2. 如果当前节点为叶子节点,则返回1。 3. 否则,递归统计左子树和右子树的叶子数,并将它们相加。 下面是Python代码实现: ```python class TreeNode: def __init__(self, val): self.val = val self.left = None self.right = None def buildTree(preorder, inorder): if not preorder or not inorder: return None root_val = preorder[0] root = TreeNode(root_val) root_index = inorder.index(root_val) root.left = buildTree(preorder[1:root_index+1], inorder[:root_index]) root.right = buildTree(preorder[root_index+1:], inorder[root_index+1:]) return root def preorderTraversal(root): if not root: return [] res = [] res.append(root.val) res += preorderTraversal(root.left) res += preorderTraversal(root.right) return res def inorderTraversal(root): if not root: return [] res = [] res += inorderTraversal(root.left) res.append(root.val) res += inorderTraversal(root.right) return res def postorderTraversal(root): if not root: return [] res = [] res += postorderTraversal(root.left) res += postorderTraversal(root.right) res.append(root.val) return res def countLeaves(root): if not root: return 0 if not root.left and not root.right: return 1 return countLeaves(root.left) + countLeaves(root.right) # 示例 preorder = [1, 2, 4, 5, 3, 6, 7] inorder = [4, 2, 5, 1, 6, 3, 7] root = buildTree(preorder, inorder) print("先序遍历:", preorderTraversal(root)) print("中序遍历:", inorderTraversal(root)) print("后序遍历:", postorderTraversal(root)) print("叶子数:", countLeaves(root)) --相关问题--:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值