Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 左子右同胞二叉树的平均叶高_Algorithm_Binary Tree_Average - Fatal编程技术网

Algorithm 左子右同胞二叉树的平均叶高

Algorithm 左子右同胞二叉树的平均叶高,algorithm,binary-tree,average,Algorithm,Binary Tree,Average,我在练习一门考试,我有一个我想不出来的例子。无论如何,任务是这样的: public class TreeLCRSnode { public TreeLCRSnode parent, leftSon, rightSibling; } int currentHeight, leafHeightSum, leafNumber; double traverse(TreeLCRSnode node) { currentHeight = 0; leafHeightSum = 0;

我在练习一门考试,我有一个我想不出来的例子。无论如何,任务是这样的:

public class TreeLCRSnode {
    public TreeLCRSnode parent, leftSon, rightSibling;
}
int currentHeight, leafHeightSum, leafNumber;
double traverse(TreeLCRSnode node) {
    currentHeight = 0;
    leafHeightSum = 0;
    leafNumber = 0;
    traverseHelper(node);
    // if the tree can be empty you might need a check here.
    return (double)leafHeightSum  / (double)leafNumber;
}

void traverseHelper(TreeLCRSnode node) {
    while (node != null) {
        if (node.leftSon) {
            currentHeight++;
            traverseHelper(node.leftSon);
            currentHeight--;
        } else {
            leafHeightSum  += currentHeight;
            leafNumber++;
        }
        node = node.rightSibling;
    }
}
您有一个左子右同级树的数据结构 像这样:

public class TreeLCRSnode {
    public TreeLCRSnode parent, leftSon, rightSibling;
}
int currentHeight, leafHeightSum, leafNumber;
double traverse(TreeLCRSnode node) {
    currentHeight = 0;
    leafHeightSum = 0;
    leafNumber = 0;
    traverseHelper(node);
    // if the tree can be empty you might need a check here.
    return (double)leafHeightSum  / (double)leafNumber;
}

void traverseHelper(TreeLCRSnode node) {
    while (node != null) {
        if (node.leftSon) {
            currentHeight++;
            traverseHelper(node.leftSon);
            currentHeight--;
        } else {
            leafHeightSum  += currentHeight;
            leafNumber++;
        }
        node = node.rightSibling;
    }
}
您需要编写一个名为double avgH(TreeLCRSnode root)的函数 将返回平均叶高的结果

为了确保每个人都理解,leaf是一个没有任何子节点的节点。例如,如果一棵树看起来像这样

4
|
2----7
|
3

然后有两个叶子,一个在高度1(编号7),一个在高度2(编号3)。

首先,您需要编写一个程序来遍历树。比如:

void traverse(TreeLCRSnode node) {
    while (node != null) {
        if (node.leftSon) traverse(node.leftSon);
        node = node.rightSibling;
    }
}

这将使您访问所有节点。然后,您只需确定节点是否为叶,并找出如何计算平均值(提示:传递一个深度,跟踪到目前为止找到的叶的深度之和,以及到目前为止找到的叶的总数)。

我认为,对于此任务,您需要使用几个全局变量:

  • currentHeight
    -递归中的当前高度
  • leafHeightSum
    -当前找到的所有树叶的高度之和
  • leafNumber
    -到目前为止找到的所有离开的计数
然后,解决方案可以如下所示:

public class TreeLCRSnode {
    public TreeLCRSnode parent, leftSon, rightSibling;
}
int currentHeight, leafHeightSum, leafNumber;
double traverse(TreeLCRSnode node) {
    currentHeight = 0;
    leafHeightSum = 0;
    leafNumber = 0;
    traverseHelper(node);
    // if the tree can be empty you might need a check here.
    return (double)leafHeightSum  / (double)leafNumber;
}

void traverseHelper(TreeLCRSnode node) {
    while (node != null) {
        if (node.leftSon) {
            currentHeight++;
            traverseHelper(node.leftSon);
            currentHeight--;
        } else {
            leafHeightSum  += currentHeight;
            leafNumber++;
        }
        node = node.rightSibling;
    }
}

这是一个轻微的修改。它的目标是更加简洁,避免全局变量,因为
currentHeight
是通过值传递的,
leafNumber
是通过引用传递的,而leaf height的总和是返回值

双导线测量(TreeLCRSnode){
整数=0;
返回(双精度)遍历帮助器(节点、0和leafNumber)/(双精度)leafNumber;
}
int traverseHelper(树节点,int currentHeight,int*leafNumber){
如果(!node)返回0;
如果(!node.leftSon){
(*叶数)++;
返回currentHeight+遍历(node.rightSibling、currentHeight、leafNumber);
}否则{
返回遍历(node.leftSon,currentHeight+1,leafNumber)+遍历(node.rightSibling,currentHeight,leafNumber);
}
}

我以前已经做过,但我仍然不知道如何继续。如何检测我处于哪个级别,如何计算所有级别以及如何计算所有叶子?特别是当我只能向递归函数发送一个参数时。如果你问我,这看起来很好。谢谢你,鲍里斯。