二叉搜索树

二叉搜索树要求:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。
image.png

二叉搜索树节点类:

  1. function Node (data, left, right) {
  2. this.data = data
  3. this.left = left
  4. this.right = right
  5. }

现在创建一个二叉查找树(BST),该类中只有一个表示二叉查找树根节点的Node对象,该类的构造函数将根节点初始化为null,以此创建一个空节点。

  1. let Node = function (key) {
  2. this.key = key
  3. this.left = null
  4. this.right = null
  5. }
  6. let root = null

BST要有一个insert()方法,向树中添加新节点。

  1. let insertNode = (node, newNode) => {
  2. if (newNode.key < node.key) {
  3. if (!node.left) {
  4. node.left = newNode
  5. } else {
  6. insertNode(node.left, newNode)
  7. }
  8. } else {
  9. if (!node.right) {
  10. node.right = newNode
  11. } else {
  12. insertNode(node.right, newNode)
  13. }
  14. }
  15. }

将新插入节点的值与父节点值对比,如果小,就去左子树,如果大,就去右子树。如果遇到节点的左右子树为空,就将节点插入,否则就继续向下查找。

然后遍历输入的数值,构建二叉搜索树:

  1. this.insert = (key) => {
  2. let newNode = new Node (key)
  3. if (root === null) {
  4. root = newNode
  5. } else {
  6. insertNode(root, newNode)
  7. }
  8. }
  9. keys.forEach((key) => {
  10. this.insert(key)
  11. })
  12. return root
  13. }

函数整体如下:

  1. function BST(keys) {
  2. let Node = function (key) {
  3. this.key = key
  4. this.left = null
  5. this.right = null
  6. }
  7. let root = null
  8. let insertNode = (node, newNode) => {
  9. if (newNode.key < node.key) {
  10. if (!node.left) {
  11. node.left = newNode
  12. } else {
  13. insertNode(node.left, newNode)
  14. }
  15. } else {
  16. if (!node.right) {
  17. node.right = newNode
  18. } else {
  19. insertNode(node.right, newNode)
  20. }
  21. }
  22. }
  23. this.insert = (key) => {
  24. let newNode = new Node (key)
  25. if (root === null) {
  26. root = newNode
  27. } else {
  28. insertNode(root, newNode)
  29. }
  30. }
  31. keys.forEach((key) => {
  32. this.insert(key)
  33. })
  34. return root
  35. }
  36. const keys = [8,3,10,1,6,14,4,7,13]
  37. console.log(BST(keys))

上面输出结果为:

  1. Node {
  2. key: 8,
  3. left: Node {
  4. key: 3,
  5. left: Node {
  6. key: 1,
  7. left: null,
  8. right: null
  9. },
  10. right: Node {
  11. key: 6,
  12. left: [Node],
  13. right: [Node]
  14. }
  15. },
  16. right: Node {
  17. key: 10,
  18. left: null,
  19. right: Node {
  20. key: 14,
  21. left: [Node],
  22. right: null
  23. }
  24. }
  25. }

构建二叉搜索树(javascript) - 图2