给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。

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

image.png

解答

有返回值的递归写法

  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. const setInOrder = (root, val) => {
  16. if (root === null) {
  17. let node = new TreeNode(val);
  18. return node;
  19. }
  20. if (root.val > val)
  21. root.left = setInOrder(root.left, val);
  22. else if (root.val < val)
  23. root.right = setInOrder(root.right, val);
  24. return root;
  25. }
  26. return setInOrder(root, val);
  27. };

无返回值的递归

  1. var insertIntoBST = function (root, val) {
  2. let parent = new TreeNode(0);
  3. const preOrder = (cur, val) => {
  4. if (cur === null) {
  5. let node = new TreeNode(val);
  6. if (parent.val > val)
  7. parent.left = node;
  8. else
  9. parent.right = node;
  10. return;
  11. }
  12. parent = cur;
  13. if (cur.val > val)
  14. preOrder(cur.left, val);
  15. if (cur.val < val)
  16. preOrder(cur.right, val);
  17. }
  18. if (root === null)
  19. root = new TreeNode(val);
  20. preOrder(root, val);
  21. return root;
  22. };

迭代

  1. var insertIntoBST = function (root, val) {
  2. if (root === null) {
  3. root = new TreeNode(val);
  4. } else {
  5. let parent = new TreeNode(0);
  6. let cur = root;
  7. while (cur) {
  8. parent = cur;
  9. if (cur.val > val)
  10. cur = cur.left;
  11. else
  12. cur = cur.right;
  13. }
  14. let node = new TreeNode(val);
  15. if (parent.val > val)
  16. parent.left = node;
  17. else
  18. parent.right = node;
  19. }
  20. return root;
  21. };