代码随想录二刷 235. 二叉搜索树的最近公共祖先701. 二叉搜索树中的插入操作450. 删除二叉搜索树中的节点

本文介绍了二叉搜索树中查找最近公共祖先、插入新值及删除节点的算法实现。通过比较节点值,递归地遍历左、右子树来执行相应操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

235. 二叉搜索树的最近公共祖先

代码如下

func lowestCommonAncestor(root, p, q *TreeNode) *TreeNode {

                  if root == nil {

                      return nil 

                  }

                  for {

                      if root.Val > p.Val && root.Val > q.Val {  如果pq节点都在该节点小,则pq节点一定在这个节点的左子树

                          root = root.Left

                      }

                      if root.Val < p.Val && root.Val < q.Val { 同理如果pq节点都比该节点大,则pq节点一定在该节点的右子树 

                          root = root.Right

                      }

                      if (root.Val - p.Val) * (root.Val - q.Val) <= 0 {  如果当前节点大于p小于q或者相反,那么说明该节点是pq的最近公共祖先 

                          return root 

                      }

                  }

                

}

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

代码如下

func insertIntoBST(root *TreeNode, val int) *TreeNode {

          if root == nil {

               root = &TreeNode{

                   Val : val ,

               }

               return root

          }

          if root.Val > val {

              root.Left = insertIntoBST(root.Left,val)

          }else {

              root.Right = insertIntoBST(root.Right,val)

          }

          return root 

}

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

代码如下

func deleteNode(root *TreeNode, key int) *TreeNode {

                if root == nil {

                    return nil 

                }

                if key < root.Val {  首先寻找要删除的节点,如果这个节点的大小小于当前节点,则往左子树上寻找

                    root.Left = deleteNode(root.Left,key)

                    return root 

                }

                if key > root.Val {

                    root.Right = deleteNode(root.Right,key) 如果大于当前节点,则往右子树上寻找

                    return root 

                }

                if root.Right == nil && root.Left == nil {  此时说明该节点已经是要删除的节点,如果这个节点是叶子节点,则直接向上层返回nil,就删除该节点

                    return nil 

                }

                if root.Right == nil { 如果这个节点的右子树为空,则返回左子树

                    return root.Left

                }

                if root.Left == nil { 同理,左子树为空,返回右子树 

                   return root.Right

                }

                minnode := root.Right  如果左右子树都不为空,则记录下右子树

                for minnode.Left != nil { 在右子树的左子树,找到最小节点,即一直往左子树上递归直到为空

                    minnode = minnode.Left

                }

                root.Val = minnode.Val   将这个值赋值给要删除的节点

                root.Right = deletenode1(root.Right)  此时再去删除右子树的最小节点 

                return root

                

}

func deletenode1(root * TreeNode) *TreeNode {

      if root.Left == nil { 如果该节点的左子树为空,则说明该节点就是整个树的最小节点,说明需要删除这个节点

          pright := root.Right

          root.Right = nil 

          return pright

      }

      root.Left = deletenode1(root.Left) 如果左子树不为空,则一直向左子树递归 

      return root 

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值