算法_二叉树_把二叉搜索树转换为累加树

把二叉搜索树转换为累加树

leetcode链接

1.解法

思路:一看到二叉搜索树,就想到中序遍历,因为中序遍历二叉搜索树会得到一个升序序列。所以我们先进行中序遍历,然后发现我们只要对这个升序序列从最后一个值开始,依次向前累加,得到的值就是改变后的累加树中每个节点的值,例如:题目中给的例子:[0,1,2,3,4,5,6,7,8],从8开始向前累加,最后一个元素还是8,然后倒数第二个元素变为15(7+8),以此类推,得到一个变换后的序列[36,36,35,33,30,26,21,15,8],再把这些数字按照中序遍历赋给原二叉搜索树中的每个节点即可。

代码如下:

def convertBST(root):
    result = [] # 存放升序序列

	# 第一次中序遍历:获得升序序列
    def traversal1(root):
        if not root:
            return

        traversal1(root.left)
        result.append(root.val)
        traversal1(root.right)

    traversal1(root)

	# 累加
    sum = 0
    for i in range(len(result)-1,-1,-1):
        sum += result[i]
        result[i] = sum

	# 第二次升序遍历:赋值
    def traversal2(root):
        if not root:
            return

        traversal2(root.left)
        value = result.pop(0)
        root.val = value
        traversal2(root.right)

    traversal2(root)

    return root

上述代码中我们用了两次中序遍历,有没有办法可以在一次中序遍历的操作中把累加赋值都做了呢?我们可以采用右中左的反中序遍历的方法,从二叉搜索树的最右边(也就是升序序列的最后面)向最左边(也就是升序序列的最前面)进行累加和赋值。

代码如下:

def convertBST(root):
    pre = 0
    def traversal(root):
        nonlocal pre
        if not root:
            return

        traversal(root.right)
        root.val += pre
        pre = root.val
        traversal(root.left)

    traversal(root)

    return root

2.总结

算法

二叉搜索树–中序遍历,这两个密不可分

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值