• 【二叉树系列】插入&删除&修剪&有序数组转二叉搜索树&二叉搜索树转换为累加树


    【二叉树系列】插入&删除&修剪&有序数组转二叉搜索树&二叉搜索树转换为累加树

    //701. 二叉搜索树中的插入操作

    1. //701. 二叉搜索树中的插入操作
    2. func insertIntoBST(root *TreeNode, val int) *TreeNode {
    3. if root==nil{
    4. return &TreeNode{Val: val}
    5. }
    6. if root.Val<val{
    7. node:=insertIntoBST(root.Right,val)
    8. if node.Val==val{
    9. root.Right=node
    10. }
    11. }
    12. if root.Val>val{
    13. node:=insertIntoBST(root.Left,val)
    14. if node.Val==val{
    15. root.Left=node
    16. }
    17. }
    18. return root
    19. }
    20. //701. 二叉搜索树中的插入操作
    21. func insertIntoBSTV1(root *TreeNode, val int) *TreeNode {
    22. if root==nil{
    23. return &TreeNode{Val: val}
    24. }
    25. cur:=root
    26. var temp *TreeNode
    27. for cur!=nil{
    28. if cur.Val<val{
    29. temp=cur
    30. cur=cur.Right
    31. }else{
    32. temp=cur
    33. cur=cur.Left
    34. }
    35. }
    36. if temp.Val<val{
    37. temp.Right= &TreeNode{Val: val}
    38. }else{
    39. temp.Left= &TreeNode{Val: val}
    40. }
    41. return root
    42. }

    //450. 删除二叉搜索树中的节点

    1. /**
    2. 根据二叉搜索树的性质
    3. 如果目标节点大于当前节点值,则去右子树中删除;
    4. 如果目标节点小于当前节点值,则去左子树中删除;
    5. 如果目标节点就是当前节点,分为以下三种情况:
    6. 其无左子:其右子顶替其位置,删除了该节点;
    7. 其无右子:其左子顶替其位置,删除了该节点;
    8. 其左右子节点都有:其左子树转移到其右子树的最左节点的左子树上,然后右子树顶替其位置,由此删除了该节点。
    9. 出处详见:https://leetcode.cn/problems/delete-node-in-a-bst/solution/miao-dong-jiu-wan-shi-liao-by-terry2020-tc0o/
    10. */
    11. func deleteNode(root *TreeNode,key int) *TreeNode {
    12. if root==nil{
    13. return root
    14. }
    15. cur:=root
    16. var pre *TreeNode
    17. for cur!=nil{
    18. if cur.Val==key{
    19. break
    20. }
    21. pre=cur
    22. if cur.Val<key{
    23. cur=cur.Right
    24. }else{
    25. cur=cur.Left
    26. }
    27. }
    28. if pre==nil{
    29. return deleteOneNode(cur)
    30. }
    31. if pre.Left!=nil && pre.Left.Val==key{
    32. fmt.Printf("Left %d\n",pre.Val)
    33. pre.Left=deleteOneNode(cur)
    34. }
    35. if pre.Right!=nil && pre.Right.Val==key{
    36. fmt.Printf("Right %d\n",pre.Val)
    37. pre.Right=deleteOneNode(cur)
    38. }
    39. return root
    40. }
    41. func deleteOneNode(target *TreeNode)*TreeNode{
    42. if target==nil{
    43. return target
    44. }
    45. if target.Right==nil{
    46. return target.Left
    47. }
    48. cur:=target.Right//找目标右节点的左叶子节点
    49. for cur.Left!=nil{
    50. fmt.Printf("cur %d\n",cur.Val)
    51. cur = cur.Left
    52. }
    53. cur.Left=target.Left//将目标的左节点全部赋值给上述中的左叶子节点
    54. return target.Right
    55. }

    //669. 修剪二叉搜索树

    1. //669. 修剪二叉搜索树
    2. func trimBST(root *TreeNode, low int, high int) *TreeNode {
    3. if root==nil{
    4. return nil
    5. }
    6. fmt.Printf("%d\n",root.Val)
    7. if root.Val<low{
    8. fmt.Printf("Right %d\n",root.Val)
    9. //low大于左的,则说明左侧必然也小于low,故使用右侧的树
    10. return trimBST(root.Right,low,high)
    11. }
    12. if root.Val>high{
    13. fmt.Printf("Left %d\n",root.Val)
    14. return trimBST(root.Left,low,high)
    15. }
    16. root.Left=trimBST(root.Left,low,high)
    17. root.Right=trimBST(root.Right,low,high)
    18. return root
    19. }

    //108. 将有序数组转换为二叉搜索树

    1. //108. 将有序数组转换为二叉搜索树
    2. func sortedArrayToBST(nums []int) *TreeNode {
    3. ln:=len(nums)
    4. if ln==0{
    5. return nil
    6. }
    7. index:=ln/2
    8. root:=TreeNode{
    9. nums[index],sortedArrayToBST(nums[:index]),
    10. sortedArrayToBST(nums[index+1:]),
    11. }
    12. return &root
    13. }

    //538. 把二叉搜索树转换为累加树

    1. //538. 把二叉搜索树转换为累加树
    2. func convertBST(root *TreeNode) *TreeNode {
    3. var traceSum func(node *TreeNode)
    4. sum:=0//记录起始值
    5. traceSum= func(node *TreeNode) {
    6. if node==nil{
    7. return
    8. }
    9. traceSum(node.Right)
    10. fmt.Printf("%d \n",sum)
    11. sum+=node.Val
    12. node.Val=sum
    13. traceSum(node.Left)
    14. }
    15. traceSum(root)
    16. return root
    17. }

  • 相关阅读:
    PB数据库开发技术(二)-PowerBuilder数据定义
    视频怎么做成二维码?在线教学视频码的制作技巧
    Harbor仓库概述
    lowbit和树状数组的理解与部分应用
    拿到这份Java面试文档“狂刷”3周,成功拿到京东的offer
    【ML】Numpy & Pandas的学习
    【Sentinel】ProcessorSlotChain处理器插槽链与Node
    认识 Cookie 和 Session
    接口测试必备知识点(含实战项目)
    04、GO模块与包、结构体
  • 原文地址:https://blog.csdn.net/u013045746/article/details/125511858