• 二叉搜索树的最近公共祖先likou235、二叉搜索树的插入元素likou701


    我发现只要是带了二叉搜索树的,都需要使用它的特性:

    左节点比根节点小

    右节点比根节点大

    首先判断p、q是否有其中一个在根节点上

    这样就会造成本身就是最近公共祖先

    判断根节点下是否有p,q子节点,可以使用proot.val,不过在这里有一个坑,题目并没有指定p一定是左节点、q一定是右节点,所以一定要多加一个qroot.val,这样就会避免。

    什么情况p,q在左节点呢:

    p、q都小于root.val时

    什么情况p,q在右节点呢:

    p,q大于root。val时 

    1. public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
    2. dfs(root, p, q);
    3. return ans;
    4. }
    5. TreeNode ans = null;
    6. boolean f = true;
    7. private void dfs(TreeNode root, TreeNode p, TreeNode q) {
    8. if (f) {
    9. if (root == null) {
    10. return;
    11. } else if (root.val == p.val || root.val == q.val) {
    12. ans = root;
    13. f = false;
    14. }
    15. if (root.val > p.val && q.val > root.val || root.val < p.val && q.val < root.val) {
    16. ans = root;
    17. f = false;
    18. } else if (root.val > p.val && root.val > q.val) {
    19. dfs(root.left, p, q);
    20. } else if (root.val < p.val && root.val < q.val) {
    21. dfs(root.right, p, q);
    22. }
    23. }
    24. }

    然后就是插入二叉搜索树元素,这里我用迭代倒是做出来了,使用递归时,对递归理解还是不够,没写出来,看了题解:

    插入二叉搜索树的元素要遵循:

    左节点比根节点小

    右节点比根节点大

    所以进行迭代的条件就是判断待插入元素在左右节点的方向。

    1. package shuJuJieGouYuSuanFa.erChaShu;
    2. public class likou701 {
    3. public static void main(String[] args) {
    4. TreeNode root = TreeNode.getBST();
    5. print(new likou701().dfs(root, 14));
    6. }
    7. //递归
    8. private TreeNode dfs(TreeNode root, int val) {
    9. if (root == null) {
    10. return new TreeNode(val);
    11. }
    12. if (root.val > val) {
    13. root.left = dfs(root.left, val);
    14. } else {
    15. root.right = dfs(root.right, val);
    16. }
    17. return root;
    18. }
    19. private static void print(TreeNode r) {
    20. if (r == null) {
    21. return;
    22. }
    23. System.out.print(r.val + " ");
    24. print(r.left);
    25. print(r.right);
    26. }
    27. //迭代
    28. public TreeNode insertIntoBST(TreeNode root, int val) {
    29. if (root == null) {
    30. return root = new TreeNode(val);
    31. }
    32. TreeNode t = root;
    33. TreeNode p = t;
    34. while (t != null) {
    35. p = t;
    36. if (t.val < val) {
    37. t = t.right;
    38. if (t == null) {
    39. p.right = new TreeNode(val);
    40. }
    41. } else {
    42. t = t.left;
    43. if (t == null) {
    44. p.left = new TreeNode(val);
    45. }
    46. }
    47. }
    48. return root;
    49. }
    50. }

     

  • 相关阅读:
    Win11 25188.1000补丁包介绍及下载地址
    4本期刊被踢!11月SCI/SSCI目录已更新
    从零玩转系列之微信支付实战PC端支付微信回调接口搭建
    Win11黑色桌面背景如何解决?
    DispatcherServlet初始化之遍历HandlerMethod
    不用写一行代码!Python最强自动化神器!
    Linux aarch64交叉编译之 cryptopp加密库
    混合正弦余弦算法和 Lévy飞行的麻雀算法-附代码
    LeetCode刷题---19. 删除链表的倒数第 N 个结点(双指针-快慢指针)
    Spring MVC中如何进行页面重定向呢?
  • 原文地址:https://blog.csdn.net/qx020814/article/details/127708614