在 JS 中查找我的第一个二叉搜索树的高度时遇到问题

Posted

技术标签:

【中文标题】在 JS 中查找我的第一个二叉搜索树的高度时遇到问题【英文标题】:Having problems finding the height of my first Binary Search Tree in JS 【发布时间】:2022-01-24 00:14:10 【问题描述】:

这是我的构造函数以及我的“添加”方法...

function BinarySearchTree(value) 
    this.value = value;
    this.right = null;
    this.left = null;
  

BinarySearchTree.prototype.add = function(value) 
    if (value < this.value) 
      if (this.left) this.left.add(value);
      else this.left = new BinarySearchTree(value);
    
  
    if (value > this.value) 
      if (this.right) this.right.add(value);
      else this.right = new BinarySearchTree(value);
    
  ;

这是我正在尝试制作的“getNodeHeight”方法...

BinarySearchTree.prototype.getNodeHeight = function(node) 
    if (node.value === null) 
      return -1;
    
    return Math.max(this.getNodeHeight(node.left), this.getNodeHeight(node.right)) + 1;
  

这是我正在运行的测试用例...

binarySearchTree = new BinarySearchTree(5);
binarySearchTree.left = new BinarySearchTree(3);
binarySearchTree.left.left = new BinarySearchTree(1);
binarySearchTree.getNodeHeight(this);

每次我将最后一个记录到控制台时,我都会收到“无法读取未定义的属性(读取'值')”。我相信我可能错误地使用了 'this' 关键字……但我试过弄乱它但无法弄清楚!

任何提示、技巧或帮助将不胜感激...感谢您的宝贵时间!

【问题讨论】:

【参考方案1】:

问题出在getNodeHeight 函数在node.right(即null)上调用时的第一行。 null 没有 value 属性。如果你评估也会出现同样的错误

null.value

通过改变来解决这个问题

if (node.value === null) ...

if (!node) ...

在进一步调查中,在binarySearchTree.getNodeHeight(this) 中使用this 关键字可能会返回对您的Window 对象的引用,而不是binarySearchTree。尝试通过

的方式调用方法
BinarySearchTree.prototype.getNodeHeight(binarySearchTree)

祝你好运!

【讨论】:

嗯...我试过你说的,但我仍然得到“无法读取未定义的属性(读取'值')”我是否正确使用'this'? 我更新了我的答案。使用if (!node) 而不是if (node === null) 不...仍然是同样的错误!不过谢谢! 没有。我会帮你! :) 我认为实际问题很可能是您尝试使用 this 关键字来引用 binarySearchTree,但这可能会返回对其他东西的引用(可能是 Window 对象)。尝试通过BinarySearchTree.prototype.getNodeHeight(binarySearchTree)调用函数。【参考方案2】:

有两个问题,一个是@Austin 指出的关于检查输入值是否为空的问题。

另一个问题是getNodeHeight 没有默认值。为此,我假设您期望默认行为来查找整棵树的高度。将 this 传递给 getNodeHeight 是在您创建 BinarySearchTree 的上下文中传递 - 而不是实例。

function BinarySearchTree(value) 
  this.value = value;
  this.right = null;
  this.left = null;


BinarySearchTree.prototype.add = function(value) 
  if (value < this.value) 
    if (this.left) this.left.add(value);
    else this.left = new BinarySearchTree(value);
  

  if (value > this.value) 
    if (this.right) this.right.add(value);
    else this.right = new BinarySearchTree(value);
  
;

BinarySearchTree.prototype.getNodeHeight = function(node = this) 
  if (node === null) 
    return -1;
  
  return Math.max(this.getNodeHeight(node.left), this.getNodeHeight(node.right)) + 1;


const binarySearchTree = new BinarySearchTree(5);
binarySearchTree.left = new BinarySearchTree(3);
binarySearchTree.left.left = new BinarySearchTree(1);
console.log(binarySearchTree.getNodeHeight());

【讨论】:

以上是关于在 JS 中查找我的第一个二叉搜索树的高度时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

实现递归 Void 函数(查找二叉搜索树的高度)

二叉搜索树

二叉搜索树的平均查找长度及时间复杂度

二叉树之二叉搜索树的基本操作实现

数据结构-二叉搜索树的js实现

二叉树的深度平衡是啥意思?