TypeError:无法读取未定义的属性“数据”-但已定义

时间:2018-09-22 18:54:01

标签: javascript binary-search-tree typeerror graph-algorithm

我正在研究二进制搜索树算法,由于某种原因,我一直遇到类型错误。它总是在将第二个值插入树中时发生。特别是在将当前节点的值与传入数据值进行比较时

代码如下:

class Node {
    constructor(data, left = null, right = null) {
        this.data = data;
        this.leftNode = left;
        this.rightNode = right;
    }
}

class BST {
    constructor() {
        this.root = null;
    }
    insert(data) {
        const dataNode = new Node(data);
        if (this.root === null) {
            this.root = dataNode;
        } else {
            let currentNode = this.root;
            let parentNode;
            while (true) {
                parentNode = currentNode;
                if (data < currentNode.data) {
                    currentNode = parentNode.left;
                    if (parentNode.left === null) {
                        parentNode.left = dataNode
                        break;
                    }
                } else {
                    currentNode = parentNode.right
                    if (parentNode.right === null) {
                        parentNode.right = dataNode
                        break;
                    }
                }
            }
        }
    }
}
const bst = new BST();

bst.insert(10);
bst.insert(5);
bst.insert(6);
bst.insert(8);
bst.insert(12);
bst.insert(7);
bst.insert(7);

这是错误:

Uncaught TypeError: Cannot read property 'data' of undefined
    at BST.insert (<anonymous>:22:32)
    at <anonymous>:42:5

3 个答案:

答案 0 :(得分:5)

您正在做parentNode.left的{​​{1}},而您应该做undefined

答案 1 :(得分:3)

似乎您在将任何值分配给parentNode.left之前已将parent.left分配给currentNode 这也发生在正确的人身上。

答案 2 :(得分:1)

您有错字。修复了以下代码段:

class Node {
  constructor(data, left = null, right = null) {
    this.data = data;
    this.left = left;
    this.right = right;
  }
}

class BST {
  constructor() {
    this.root= null;
  }
 insert(data) {
    const dataNode = new Node(data);
    if (this.root === null) {
      this.root = dataNode;
    } else {
      let currentNode = this.root;
      let parentNode;
      while (true) {
        parentNode = currentNode;
        if (data < currentNode.data) {
          currentNode = parentNode.left;
          if (parentNode.left === null) {
            parentNode.left = dataNode;
            break;
          }
        } else {
          currentNode=parentNode.right
          if (parentNode.right === null) {
            parentNode.right = dataNode;
            break;
          }
        }
      }
    }
  }
}

const bst = new BST();

bst.insert(10);
bst.insert(5);
bst.insert(6);
bst.insert(8);
bst.insert(12);
bst.insert(7);
bst.insert(7);