构造数组的MaxTree

# 构造数组的MaxTree
from array import array


class Node:
    """二叉树节点"""
    def __init__(self, data):
        self.left = None
        self.right = None
        self.value = data

def getMaxTree(arr:array)->Node:
    nArr = [Node(i) for i in arr]
    stack = []
    lBigMap = {}
    rBigMap = {}

    # 找出所有节点左边最大的数对应的节点
    for i in range(len(arr)):
        curNode = nArr[i]
        while stack and stack[-1].value < curNode.value:
            popStackSetMap(stack, lBigMap)
        stack.append(curNode)

    while stack:
        popStackSetMap(stack, lBigMap)
    
    # 找出所有节点右边最大的数对应的节点
    for i in range(len(arr)-1, -1, -1):
        curNode = nArr[i]
        while stack and stack[-1].value < curNode.value:
            popStackSetMap(stack, rBigMap)
        stack.append(curNode)
    
    while stack:
        popStackSetMap(stack, rBigMap)

    # 将节点构建成二叉树(head对应为完整的二叉树,其他为子树)
    head = None
    for i in range(len(nArr)):
        curNode = nArr[i]
        left = lBigMap[curNode]
        right = rBigMap[curNode]
        if left == None and right == None:
            head = curNode
        elif left == None:
            if right.left == None:     # 先判断父节点左端是否有节点,没有的话接上当前节点
                right.left = curNode   # 此特性决定了该二叉树往往左偏
            else:
                right.right = curNode
        elif right == None:
            if left.left == None:
                left.left = curNode
            else:
                left.right = curNode
        else:
            parent = left if left.value < right.value else right
            if parent.left == None:
                parent.left = curNode
            else:
                parent.right = curNode
    return head


def popStackSetMap(stack:list, map_:dict):
    """
    将节点对应的数字在数组中左或者右最大的数字对应的节点形成映射
    """
    popNode = stack.pop()
    if not stack:
        map_[popNode] = None
    else:
        map_[popNode] = stack[-1]

        
if __name__ == "__main__":
    arr = array('i', [3, 4, 5, 1, 2])
    head = getMaxTree(arr)

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
设计并实现一个动态整型数组类Vect,要求: (1)实现构造函数重载,可以根据指定的元素个数动态创建初始值为0的整型数组,或根据指定的内置整型数组动态创建整型数组。 (2)设计拷贝构造函数和析构函数,注意使用深拷贝。 (3)设计存取指定位置的数组元素的公有成员函数,并进行下标越界,若越界则输出“out of boundary”。 (4)设计获取数组元素个数的公有成员函数。 (5)设计用于输出数组元素的公有成员函数,元素之间以空格分隔,最后以换行符结束。 在main函数中按以下顺序操作: (1)根据内置的静态整型数组{1,2,3,4,5}构造数组对象v1,根据输入的整型数构造数组对象v2。 (2)调用Vect的成员函数依次输出v1和v2的所有元素。 (3)输入指定的下标及对应的整型数,设置数组对象v1的指定元素。 (4)根据数组对象v1拷贝构造数组对象v3。 (5)调用Vect的成员函数依次输出v1和v3的所有元素。 设计并实现一个动态整型数组类Vect,要求: (1)实现构造函数重载,可以根据指定的元素个数动态创建初始值为0的整型数组,或根据指定的内置整型数组动态创建整型数组。 (2)设计拷贝构造函数和析构函数,注意使用深拷贝。 (3)设计存取指定位置的数组元素的公有成员函数,并进行下标越界,若越界则输出“out of boundary”。 (4)设计获取数组元素个数的公有成员函数。 (5)设计用于输出数组元素的公有成员函数,元素之间以空格分隔,最后以换行符结束。 在main函数中按以下顺序操作: (1)根据内置的静态整型数组{1,2,3,4,5}构造数组对象v1,根据输入的整型数构造数组对象v2。 (2)调用Vect的成员函数依次输出v1和v2的所有元素。 (3)输入指定的下标及对应的整型数,设置数组对象v1的指定元素。 (4)根据数组对象v1拷贝构造数组对象v3。 (5)调用Vect的成员函数依次输出v1和v3的所有元素。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值