• LeetCode538. 把二叉搜索树转化为累积二叉树


    1. 题目描述

    题目来源:力扣

    给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。

    提醒一下,二叉搜索树满足下列约束条件:

    节点的左子树仅包含键 小于 节点键的节点。
    节点的右子树仅包含键 大于 节点键的节点。
    左右子树也必须是二叉搜索树。

     图1. 示例

    分析:

    从最大的开始,那么按照遍历顺序为右中左,即为最大。那么改造原来的中序遍历,并按照右—中—左的顺序遍历。且对于每个节点来说,累计思路都是一样的,因此算法为递归结构。要注意的是,每次遍历右之后,返回一个累计值,以便中间节点+值,再返回累计值,以便左节点+值。

    2. 代码

    代码实现如下,

    1. # Definition for a binary tree node.
    2. class TreeNode(object):
    3. def __init__(self, val=0, left=None, right=None):
    4. self.val = val
    5. self.left = left
    6. self.right = right
    7. def set_left(self, left):
    8. self.left = left
    9. def set_right(self, right):
    10. self.right = right
    11. class Solution(object):
    12. def subConvertBST(self, root, pre):
    13. if root != None:
    14. self.subConvertBST(root.right, pre)
    15. root.val += pre[0]
    16. pre[0] = root.val
    17. self.subConvertBST(root.left, pre)
    18. return
    19. def convertBST(self, root):
    20. """
    21. :type root: TreeNode
    22. :rtype: TreeNode
    23. """
    24. pre = [0]
    25. self.subConvertBST(root, pre)
    26. return root
    27. if __name__ == '__main__':
    28. sol = Solution()
    29. # 将搜索二叉树转化为累积二叉树
    30. node1 = TreeNode(10)
    31. node2 = TreeNode(5)
    32. node3 = TreeNode(15)
    33. node4 = TreeNode(1)
    34. node5 = TreeNode(20)
    35. node1.left = node2
    36. node1.right = node3
    37. node3.right = node5
    38. print(sol.preorderTraversal(node1))
    39. r = sol.convertBST(node1)
    40. path = sol.preorderTraversal(r)
    41. print(path)

  • 相关阅读:
    美发集团怎样运用虚拟机器人增加数据收集范围
    Linux系统漏洞本地提权
    利用京东云Web应用防火墙实现Web入侵防护
    volatile关键字在并发中有哪些作用?
    【js】js中深拷贝与浅拷贝:
    C#调用python脚本教程使用pythonnet方式
    linux清理缓存垃圾命令和方法介绍
    (完美方案)解决mfc140u.dll文件丢失问题,快速且有效的修复
    暖通锅炉远程监控解决方案
    【Java】线程池学习(重要)
  • 原文地址:https://blog.csdn.net/qq_45031079/article/details/125483826