BST在javascript中使用引用对象

时间:2016-11-15 15:37:44

标签: javascript algorithm binary-search-tree

我在javascript中从数据结构和算法中找到了这个算法。对于插入方法,有两个对根(current和parent)的引用。我的问题是,为什么我不能将当前和父母都改为this.root?他们都指向this.root。但是,当我这样做时,代码无法正常工作

'use strict';

var BST = function() {
  this.root = null;

//embed _Node inside BST so it comes with when BST is created
  this._Node = function(data, left, right) {
    this.data = data;
    this.count = 1;
    this.left = left;
    this.right = right;
  };

  this._Node.prototype.show = function() {
    return this.data;
  };

  this._Node.prototype.showCount = function() {
    return this.count;
  }
};


BST.prototype.insert = function(data) {
  //use this data for a new node
  var n = new this._Node(data, null, null);
  //if root is null, put this new node and its data into root
  if (this.root === null) {
    this.root = n;
  }
  else {
    //find a child position for this node
    var current = this.root;
    var parent;
    while (true) {
      parent = current;
      if (data < current.data) {
        current = current.left;
        if (current === null) {
          parent.left = n;
          break;
        }
      }
      else {
        current = current.right;
        if (current === null) {
          parent.right = n;
          break;
        }
      }
    }
  }
};

var nums = new BST(); 
nums.insert(23); 
nums.insert(45); 
nums.insert(16); 
nums.insert(37); 
nums.insert(3); 
nums.insert(99); 
nums.insert(22); 

2 个答案:

答案 0 :(得分:2)

current在整个算法中都没有引用this.root

它已初始化为this.root,但随后会快速重新分配到current = current.left;current = current.right;。从current开始,this.root不再是this.root.left。它可以是this.root.rightthis.root

在while循环的下一次迭代中,它将再次被重新分配,但它永远不再是current,因为它总是被重新分配给parent的子节点。

this.root类似,仅在第一次迭代时为parent = current;。在每次后续迭代中,它由current is no longer重新分配,并从, this.root won't be var $row = $("<tr>" + "<td>" + "<div style=\"border-top:3px;padding-top:3px\">" + $("<a>" + result.fileName + "</a>").attr({ href: "/AgencyNotes/OpenFile/" + result.fileName + "/" + result.agencyNoteId }) + "</div>" + "</td>" + "</tr>") $(temp).children().children().children().children().first().after($row) this.root`重新分配。

答案 1 :(得分:0)

parent仅用于保存前一个节点的引用,您创建新节点n,然后在current变为null后在树中找到它的位置,您找到了节点n的目标位置,您需要将其指定为子节点leftright)到parent节点