Java 需要帮助计算任意二叉树左右分支的深度吗
我必须为我的数据结构课程写一个AVL树,我一直在计算子树的平衡因子,这样我就知道在哪里以及如何旋转树 谢谢, 埃里克 编辑: 我知道必须计算二叉树中的节点数Java 需要帮助计算任意二叉树左右分支的深度吗,java,algorithm,tree,Java,Algorithm,Tree,我必须为我的数据结构课程写一个AVL树,我一直在计算子树的平衡因子,这样我就知道在哪里以及如何旋转树 谢谢, 埃里克 编辑: 我知道必须计算二叉树中的节点数 private int countTotalNodes(AVLNode<T> start){ AVLNode<T> current = start; if(current.getLeft() != null){ return countTotalNodes(current.getL
private int countTotalNodes(AVLNode<T> start){
AVLNode<T> current = start;
if(current.getLeft() != null){
return countTotalNodes(current.getLeft());
}
if(current.getRight() != null){
return countTotalNodes(current.getRight());
}
return 1;
}
private int countTotalNodes(AVLNode开始){
AVLNode电流=启动;
if(current.getLeft()!=null){
返回countTotalNodes(current.getLeft());
}
if(current.getRight()!=null){
返回countTotalNodes(current.getRight());
}
返回1;
}
编写计算树深度的方法,然后将其应用于左、右子树
这就是树数据结构的美妙之处:它具有自然的自相似性和递归性。通常的方法是在树节点的数据结构中添加一个平衡因子字段。平衡因子的更改发生在插入和删除时,这些更改会随着旋转而传播,以保持事物的平衡。这有一个很好的解释,使用伪代码
在每次插入或删除时计算余额(而不是将余额作为每个节点的额外簿记)会使这些操作更加昂贵。我认为AVL树的通常实现将节点高度存储在节点本身中,并在插入、剪切和链接操作中更新。在这些操作之后,我们必须检查更高节点的高度是否仍然正确,如下所示:
/**
* Recursively updates heights starting with given node.
* If height of given node is already correct we know
* that we can stop.
*/
private void updateHeights(AvlNode<T> node){
if(node == null) return;
int heightLeft = node.left != null ? node.left.height : -1;
int heightRight = node.right != null ? node.right.height : -1;
int height = heightLeft > heightRight ? heightLeft + 1 : heightRight + 1;
if(node.height != height){
node.height = height;
updateHeights(node.parent);
}
}
/**
*递归更新从给定节点开始的高度。
*若给定节点的高度已经正确,我们就知道了
*我们可以停下来。
*/
私有void更新权重(AvlNode节点){
if(node==null)返回;
int heightLeft=node.left!=null?node.left.height:-1;
int heightRight=node.right!=null?node.right.height:-1;
int height=heightLeft>heightRight?heightLeft+1:heightRight+1;
如果(node.height!=高度){
node.height=高度;
更新权重(node.parent);
}
}
它总是在最高更改节点的父节点上调用。啊,好时光-实现AVL树是一个有趣的小项目-祝你好运。。仔细地测试它 节点数的计数函数是错误的(非常退化的树除外)-它要么计算左子树,要么计算右子树,但决不能同时计算两者。试着先纠正这个问题 然后考虑如何使用类似的算法来构造深度
但正如在其他答案中所说,不要用它来平衡你的树,因为这样做的性能损失将超过拥有一个平衡树的所有好处。而是将深度存储在节点中,并考虑何时需要进行调整。您知道如何遍历树吗?你有递归函数吗?每个迭代都能看到全局“深度”值吗?我理解的是,问题在于编写方法:D