• 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)

  • 相关阅读:
    C++快速幂(递归)
    linux中构建一个launch文件
    一分钟理解npm run dev 和 npm run serve
    双硬盘WIN+UBUNTU 系统, 重装UNBUNTU20.14系统后无法启动, 进入进入grub rescue
    使用NTP配置集群时间同步(CentOS 7.9操作系统)
    【AXI】解读AXI协议乱序机制
    Boost.Interprocess 的同步
    ai 问答时刻
    【C语言】函数传参与指针理解
    【Redis】redis事务和发布订阅
  • 原文地址:https://blog.csdn.net/qq_45031079/article/details/125483826