二叉搜索树的插入

题目描述

力扣链接🔗

二叉搜索树的插入 - 图1

代码思路

根据二叉树的性质,进行搜索,由于插入在叶子节点,搜索到最后进行插入。

有返回值的递归

有返回值的递归,在添加时可以直接进行返回,最后会递归到root。

  1. /**
  2. * 有返回值的递归法
  3. *
  4. * @param root
  5. * @param val
  6. * @return
  7. */
  8. public TreeNode insertIntoBST(TreeNode root, int val) {
  9. if (root == null) { // 当节点为空时,此时就该赋值了
  10. TreeNode treeNode = new TreeNode(val);
  11. return treeNode;
  12. }
  13. if (root.val > val) {
  14. root.left = insertIntoBST(root.left, val);
  15. } else {
  16. root.right = insertIntoBST(root.right, val);
  17. }
  18. return root;
  19. }

无返回值的递归

无返回值递归需要记录上一次的节点,在进行添加。(因为不像有返回值递归可以直接返回到根节点)

  1. /**
  2. * 无返回值的递归法
  3. *
  4. * @param root
  5. * @param val
  6. * @return
  7. */
  8. public TreeNode insertIntoBST(TreeNode root, int val) {
  9. if (root == null) {
  10. return new TreeNode(val);
  11. }
  12. traversal(root, val);
  13. return root;
  14. }
  15. TreeNode parent; // 用来记录上一个节点
  16. public void traversal(TreeNode cur, int val) {
  17. if (cur == null) { // 当到达最后时,需要用上一个节点来赋值
  18. TreeNode node = new TreeNode(val);
  19. if (parent.val > val) {
  20. parent.left = node;
  21. } else {
  22. parent.right = node;
  23. }
  24. return;
  25. }
  26. parent = cur;
  27. if (cur.val > val) traversal(cur.left, val);
  28. if (cur.val < val) traversal(cur.right, val);
  29. return;
  30. }

迭代法

迭代法也需要记录上一次的节点,在进行添加。

  1. /**
  2. * 迭代法
  3. *
  4. * @param root
  5. * @param val
  6. * @return
  7. */
  8. public TreeNode insertIntoBST(TreeNode root, int val) {
  9. if (root == null) {
  10. return new TreeNode(val);
  11. }
  12. TreeNode cur = root;
  13. // 记录上一个节点进行赋值
  14. TreeNode parent = root;
  15. while (cur != null) {
  16. parent = cur; // 需要放在最前面,最后一轮时,在最底层
  17. if (cur.val > val) {
  18. cur = cur.left;
  19. } else {
  20. cur = cur.right;
  21. }
  22. }
  23. if (parent.val > val) {
  24. parent.left = new TreeNode(val);
  25. } else {
  26. parent.right = new TreeNode(val);
  27. }
  28. return root;
  29. }