计算之魂 思考题2.2 Q2

文章介绍了如何使用算法构建一个二叉排序树,该树基于给定的一串数字,如5,2,8等。算法首先以5为根节点开始,然后按照二叉排序树的规则插入其余数字。复杂度分析提到,在最坏情况下,时间复杂度为O(n*n),而平均情况为O(nlogn)。为了按顺序获取这些数字,文章推荐使用中序遍历方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Q2. (二叉排序树)有这样一串数字,5,2,8,0,10,7,18,20,30,12,15,1,将它们建成一颗二叉排序树。二叉排序树满足下面的条件:

(1)如果左子树不为空,则左子树上所有的节点的值均小于树的根节点的值。同样,如果右子树不为空,则右子树上所有节点的值均大于树的根节点的值。

(2)左右子树本身也是二叉排序树。

对于上述数字,我们在建立二叉排序树时,先把第一个数字5放在根节点,然后扫描第二个数字2,由于它比根节点的数字5小,因此我们将它放在左子树中。接下来我们扫描第三个数字8,由于它比根节点的数字5大,因此我们将它放在右子树中。重复上述过程,我们可以建成完整的二叉排序树。请完成下面三个小问题:

i:写一个算法完成上述操作。

ii:这个算法的复杂度是多少?

iii:用何种遍历方法得到的结果恰好把上面的一串数字排好序?

(1)

class TreeNode:
    def __init__(self, value, left_node, right_node):
        self.value = value
        self.left_node = left_node
        self.right_node = right_node


class Tree:
    def __init__(self, tree_node):
        self.root = tree_node

    def insert(self, value):
        new_node = TreeNode(value, None, None)
        current_node = self.root
        while current_node:
            if current_node.value < new_node.value:
                if current_node.right_node is None:
                    current_node.right_node = new_node
                    return
                current_node = current_node.right_node
            else:
                if current_node.left_node is None:
                    current_node.left_node = new_node
                    return
                current_node = current_node.left_node

    def build(self, tree_node_list):
        for item in tree_node_list:
            self.insert(item)


def ergodic_tree(node):
    if node is None:
        return
    ergodic_tree(node.left_node)
    print(f'current node is {node.value}')
    ergodic_tree(node.right_node)


if __name__ == '__main__':
    root_node = TreeNode(5, None, None)
    new_tree = Tree(root_node)
    test_arr = [2, 8, 0, 10, 7, 18, 20, 30, 12, 15, 1]
    new_tree.build(test_arr)
    ergodic_tree(root_node)

(2)平均时间复杂度 O(nlogn),最坏情况下O(n*n)
(3)中序遍历

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值