• 代码随想录Day18 LeetCode235 二叉搜索树的公共祖先 T701二叉搜索树中的插入操作 T140 删除二叉搜索树中的公共节点


    LeetCode T235 二叉搜索树的公共祖先

    题目链接235. 二叉搜索树的最近公共祖先 - 力扣(LeetCode)

    题目思路

    此题不涉及遍历顺序.

    关于二叉搜索树的定义,这里我就不过多赘述了,前面几篇都说清楚了,根节点比左子树元素都大,比右子树元素都小,这道题我们就可以知道,两个节点的最近公共祖先一定满足夹在两个节点的中间这个条件.

    那么,夹在两个节点之间的一定是最近的公共祖先吗?

    答案是肯定的,我们不妨这样想,如果我们的节点这个时候再向左遍历,我们就会丢失右子树包含的那个节点,左子树同理.思路理顺了我们就来书写代码吧.

    递归三部曲

    1.函数参数和返回值

    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) 

    2.终止条件

    如果遇到空节点,直接返回空节点即可

    1. if(root == null)
    2. {
    3. return null;
    4. }

    3.一次递归逻辑

    1. if(root.val>q.val && root.val>p.val)
    2. {
    3. TreeNode left = lowestCommonAncestor(root.left,p,q);
    4. if(left != null)
    5. {
    6. return left;
    7. }
    8. }
    9. if(root.val
    10. {
    11. TreeNode right = lowestCommonAncestor(root.right,p,q);
    12. if(right != null)
    13. {
    14. return right;
    15. }
    16. }
    17. return root;

    其实我么也发现了,无论遇不遇到空节点都可以直接返回,那么我们的代码又可以进一步的简化.

    题目代码

    1. class Solution {
    2. public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
    3. if(root == null)
    4. {
    5. return null;
    6. }
    7. if(root.val>q.val && root.val>p.val)
    8. {
    9. TreeNode left = lowestCommonAncestor(root.left,p,q);
    10. if(left != null)
    11. {
    12. return left;
    13. }
    14. }
    15. if(root.val
    16. {
    17. TreeNode right = lowestCommonAncestor(root.right,p,q);
    18. if(right != null)
    19. {
    20. return right;
    21. }
    22. }
    23. return root;
    24. }
    25. }
    26. //上述代码的简化版
    27. class Solution {
    28. public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
    29. if (root.val > p.val && root.val > q.val) return lowestCommonAncestor(root.left, p, q);
    30. if (root.val < p.val && root.val < q.val) return lowestCommonAncestor(root.right, p, q);
    31. return root;
    32. }
    33. }
    34. //迭代法
    35. class Solution {
    36. public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
    37. while(true)
    38. {
    39. if(root.val>q.val && root.val>p.val)
    40. {
    41. root = root.left;
    42. }
    43. else if(root.val
    44. {
    45. root = root.right;
    46. }
    47. else
    48. {
    49. break;
    50. }
    51. }
    52. return root;
    53. }
    54. }

    LeetCode T701 二叉搜索树中的插入操作

    题目链接701. 二叉搜索树中的插入操作 - 力扣(LeetCode)

    题目思路

    这里我们看到这道题可以改变二叉搜索树的形状,可以返回任意有效的结果,我们就有点慌,其实这里我们所有节点的插入都可以在叶子节点完成,无论插入什么大小的节点我们都可以插入在叶子节点来解决问题.那么有了这个思路题目就变得简单了,我们只需要找到对应的叶子节点,创建一个新节点再连接即可.下面我们看看代码怎么写.

    函数参数以及返回值

    这里就用LeetCode本身提供的函数即可

    2.终止条件

    遇见空节点就说明我们找到了,直接创建新节点,向上返回即可

    1. if(root == null)
    2. {
    3. TreeNode node = new TreeNode(val);
    4. return node;
    5. }

    3.单次递归

    如果在左边插入,就用左子树来接收这个节点,反之用右子树来接收

    1. if(val
    2. {
    3. root.left = insertIntoBST(root.left,val);
    4. }
    5. if(val>root.val)
    6. {
    7. root.right = insertIntoBST(root.right,val);
    8. }
    9. return root;

    题目代码

    1. class Solution {
    2. public TreeNode insertIntoBST(TreeNode root, int val) {
    3. if(root == null)
    4. {
    5. TreeNode node = new TreeNode(val);
    6. return node;
    7. }
    8. if(val
    9. {
    10. root.left = insertIntoBST(root.left,val);
    11. }
    12. if(val>root.val)
    13. {
    14. root.right = insertIntoBST(root.right,val);
    15. }
    16. return root;
    17. }
    18. }

    LeetCode T140 删除二叉搜索树的节点

    题目链接450. 删除二叉搜索树中的节点 - 力扣(LeetCode)

    题目思路

    这里我们先考虑五种可能的情况

    1.找不到这个key对应的节点

    2.能找到

    2.1这个节点是叶子结点

    直接返回空即可

    2.2这个节点的左孩子为空,右孩子不为空

    返回右孩子

    2.3这个节点的左孩子不为空,右孩子为空

    返回左孩子

    2.4这个节点左右孩子都不为空

    这个的处理较为复杂,我们举个例子说明

    假设我们要删除7节点,我们就得调整二叉树的结构

    假设我们保留右子树(保留左子树也可以,方法一样)

    我们找到右子树中的最小值(右子树中的左子树的最小值),将原左子树接在这个节点下面即可

    递归逻辑

    1.确定递归函数以及返回值

    使用函数本身即可

    2.确定终止条件

    由于这次的终止条件是找到节点的过程,所以较为复杂

    1. if(root == null)
    2. {
    3. return null;
    4. }
    5. if(root.val == key)
    6. {
    7. if(root.left == null && root.right == null)
    8. {
    9. return null;
    10. }
    11. else if(root.left != null && root.right == null)
    12. {
    13. return root.left;
    14. }
    15. else if(root.right != null && root.left == null)
    16. {
    17. return root.right;
    18. }
    19. else {
    20. TreeNode cur = root.right;
    21. while (cur.left != null) {
    22. cur = cur.left;
    23. }
    24. cur.left = root.left;
    25. root = root.right;
    26. return root;
    27. }
    28. }

    3.确定一次递归逻辑

    1. if(root.val
    2. {
    3. root.right = deleteNode(root.right,key);
    4. }
    5. if(key
    6. {
    7. root.left = deleteNode(root.left,key);
    8. }
    9. return root;

    题目代码

    1. class Solution {
    2. public TreeNode deleteNode(TreeNode root, int key) {
    3. if(root == null)
    4. {
    5. return null;
    6. }
    7. if(root.val == key)
    8. {
    9. if(root.left == null && root.right == null)
    10. {
    11. return null;
    12. }
    13. else if(root.left != null && root.right == null)
    14. {
    15. return root.left;
    16. }
    17. else if(root.right != null && root.left == null)
    18. {
    19. return root.right;
    20. }
    21. else {
    22. TreeNode cur = root.right;
    23. while (cur.left != null) {
    24. cur = cur.left;
    25. }
    26. cur.left = root.left;
    27. root = root.right;
    28. return root;
    29. }
    30. }
    31. if(root.val
    32. {
    33. root.right = deleteNode(root.right,key);
    34. }
    35. if(key
    36. {
    37. root.left = deleteNode(root.left,key);
    38. }
    39. return root;
    40. }
    41. }

  • 相关阅读:
    LaTex生成引文(参考文献)时出现乱序,想把引文按顺序显示的解决方法
    小程序,公众号绑定微信开放平台帐号-UnionID机制
    多线程概述
    【Docker】本地镜像与私有库:发布、拉取,图文展示全过程
    lvs集群
    栈和队列相关的一些问题
    我的四周年创作纪念日
    爬虫的http和https基础
    react context原理
    红包算法 java实现
  • 原文地址:https://blog.csdn.net/qiuqiushuibx/article/details/133816280