1. 题目描述

给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 保证原始二叉搜索树中不存在新值。

注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回任意有效的结果。

例如,

给定二叉搜索树:

  1. 4
  2. / \
  3. 2 7
  4. / \
  5. 1 3

和 插入的值: 5
你可以返回这个二叉搜索树:

  1. 4
  2. / \
  3. 2 7
  4. / \ /
  5. 1 3 5

或者这个树也是有效的:

  1. 5
  2. / \
  3. 2 7
  4. / \
  5. 1 3
  6. \
  7. 4

2. 解题思路

使用递归的迭代的方法实现。

3. 代码实现

递归实现:

  1. /**
  2. * Definition for a binary tree node.
  3. * function TreeNode(val, left, right) {
  4. * this.val = (val===undefined ? 0 : val)
  5. * this.left = (left===undefined ? null : left)
  6. * this.right = (right===undefined ? null : right)
  7. * }
  8. */
  9. /**
  10. * @param {TreeNode} root
  11. * @param {number} val
  12. * @return {TreeNode}
  13. */
  14. var insertIntoBST = function(root, val) {
  15. if(!root){
  16. return new TreeNode(val)
  17. }
  18. if(val < root.val){
  19. root.left = insertIntoBST(root.left,val)
  20. }else{
  21. root.right = insertIntoBST(root.right,val)
  22. }
  23. return root
  24. };

迭代实现:

  1. /**
  2. * Definition for a binary tree node.
  3. * function TreeNode(val, left, right) {
  4. * this.val = (val===undefined ? 0 : val)
  5. * this.left = (left===undefined ? null : left)
  6. * this.right = (right===undefined ? null : right)
  7. * }
  8. */
  9. /**
  10. * @param {TreeNode} root
  11. * @param {number} val
  12. * @return {TreeNode}
  13. */
  14. var insertIntoBST = function(root, val) {
  15. if(!root){
  16. return new TreeNode(val)
  17. }
  18. let cur = root
  19. while(cur){
  20. if(val > cur.val){
  21. if(!cur.right){
  22. cur.right = new TreeNode(val)
  23. return root
  24. }else{
  25. cur = cur.right
  26. }
  27. }else{
  28. if(!cur.left){
  29. cur.left = new TreeNode(val)
  30. return root
  31. }else{
  32. cur = cur.left
  33. }
  34. }
  35. }
  36. return root
  37. };

4. 提交结果

递归实现:
701. 二叉搜索树中的插入操作 - 图1
迭代实现:
701. 二叉搜索树中的插入操作 - 图2