当前位置: 首页 > 知识库问答 >
问题:

计算二叉搜索树的最大不平衡

宣意致
2023-03-14

我目前正在编写一个递归方法,以返回整个二元搜索树上的最大不平衡。我对递归编程非常陌生,所以很难理解。我构建的树的不平衡度为1,但我的方法只返回0。我相信我的逻辑是有缺陷的。

我百分之百确定它正在运行“(root==null){返回0;}”在方法的每个步骤中。我尝试删除它并进一步定义它,它仍在继续这样做。

这是我当前的方法:

public int getMaxImbalance(){
  return Math.abs(getMaxImbalance(root));
}

public int getMaxImbalance (TreeNode<E> root){

  if (root == null){
      return 0;
  }else if(root.left != null && root.right == null){

      return 1 + getMaxImbalance(root.left) + getMaxImbalance(root.right);
              //adds 1 left is true and right is false

  }else if(root.left == null && root.right != null){

      return -1 + getMaxImbalance(root.left) + getMaxImbalance(root.right);
      //adds -1 left is false and right is true

  }

  return getMaxImbalance(root.left) + getMaxImbalance(root.right);
      //calls itself if both fields are null;

}

共有1个答案

皮景龙
2023-03-14

代码中的逻辑似乎是错误的:节点的最大不平衡不是其子节点(ren)的最大不平衡之和。相反,最大不平衡应该是其子节点高度差(ren)的abs(如果其中一个为空,则该节点的最大不平衡仅为0,因此当前节点的最大不平衡完全取决于其唯一的子节点)。

 类似资料:
  • 在上一节中,我们考虑构建一个二叉搜索树。正如我们所学到的,二叉搜索树的性能可以降级到 $$O(n)$$ 的操作,如 get 和 put ,如果树变得不平衡。在本节中,我们将讨论一种特殊类型的二叉搜索树,它自动确保树始终保持平衡。这棵树被称为 AVL树,以其发明人命名:G.M. Adelson-Velskii 和E.M.Landis。 AVL树实现 Map 抽象数据类型就像一个常规的二叉搜索树,唯一

  • 计算二叉树最大的宽度 根据带虚结点的先序序列建立二叉树,计算该二叉树最大的宽度(二叉树的最大宽度是指二叉树所有层中结点个数的最大值)并输出。 输入格式: 测试数据有多组,处理到文件尾。每组测试数据在一行中输入一个字符串(不含空格且长度不超过80),表示二叉树的先序遍历序列,其中字符*表示虚结点(对应的子树为空)。 输出格式: 对于每组测试,输出二叉树的最大宽度。输出格式为:“maxWidth: m

  • 在我们继续之前,我们来看看执行这个新的平衡因子要求的结果。我们的主张是,通过确保树总是具有 -1,0或1 的平衡因子,我们可以获得更好的操作性能的关键操作。 让我们开始思考这种平衡条件如何改变最坏情况的树。有两种可能性,一个左重树和一个右重树。 如果我们考虑高度0,1,2和3的树,Figure 2 展示了在新规则下可能的最不平衡的左重树。 Figure 2 看树中节点的总数,我们看到对于高度为0的

  • 所以,我一直在研究平衡的二叉查找树。 我谷歌了一下,这是我的发现: 二叉树,其中每个节点的两个子树的深度相差 1 或更小(来自维基百科) 难道就不能把平衡二叉树定义为高度不超过ceil(log(n ^ 1)/log ^ 2)的树吗? 从这个答案来看,提问者似乎已经问了同样的事情,但是公认的答案通过举斐波纳契树的例子拒绝了这个想法。斐波纳契树不是平衡树,对吗?我认为回答者可能会与AVL树中平衡树的定

  • 我需要得到所有节点的x,y坐标,例如: X:使用顺序遍历访问节点之前已经访问的节点数 Y:节点从根开始的深度 例如对于节点15,x=5(15之前:已经访问过7, 8, 9, 10, 13),y=1(第二级) 树没有父指针 结果:x是错误的,y是正确的 打印: 结果: 我已经尝试过了(我认为这是不正确的,因为正确的子树遍历不计入节点) 结果是

  • 我不知道这些节点是否被插入,但输出结果是正确的。我只想插入节点到左边的孩子,我可以消除那代码吗?root.right=insertLevelOrder(arr,root.right,2*i+2); 还有为什么这个循环没有“i++”的符号,int i是如何自动增加的?