Java 需要帮助计算任意二叉树左右分支的深度吗

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

我必须为我的数据结构课程写一个AVL树,我一直在计算子树的平衡因子,这样我就知道在哪里以及如何旋转树

谢谢, 埃里克

编辑:

我知道必须计算二叉树中的节点数

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