【问题标题】:Average leaf height in Left Child Right Sibling binary tree左子右兄弟二叉树的平均叶高
【发布时间】:2012-09-08 17:50:38
【问题描述】:

我正在准备一场考试,但我有一个例子我想不通。无论如何,任务是这样的:

你有一个左子右兄弟树的数据结构,看起来 像这样:

public class TreeLCRSnode {
    public TreeLCRSnode parent, leftSon, rightSibling;
}

您需要编写一个名为 double avgH(TreeLCRSnode root) 的函数 将返回平均叶高的结果。

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

4
|
2----7
|
3

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

【问题讨论】:

    标签: algorithm binary-tree average


    【解决方案1】:

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

    • currentHeight - 递归中的当前高度
    • leafHeightSum - 当前找到的所有叶子的高度总和
    • leafNumber - 到目前为止找到的所有叶子的计数

    那么解决方案可以是这样的:

    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;
        }
    }
    

    【讨论】:

    • 如果你问我,这看起来不错。谢谢鲍里斯。
    【解决方案2】:

    这是对Boris Strandjev answer 的轻微修改。它的目标是更简洁一些并避免使用全局变量,因为currentHeight 是按值传递的,leafNumber 是按引用传递的,叶子高度的总和是返回值。

    double traverse(TreeLCRSnode node) {
        int leafNumber=0;
    
        return (double)traverseHelper(node,0,&leafNumber)/(double)leafNumber;
    }
    
    int traverseHelper(TreeLCRSnode node, int currentHeight, int *leafNumber) {
        if(!node) return 0;
    
        if(!node.leftSon) {
            (*leafNumber)++;
            return currentHeight + traverse(node.rightSibling, currentHeight, leafNumber);
        } else {
            return traverse(node.leftSon, currentHeight+1, leafNumber) + traverse(node.rightSibling, currentHeight, leafNumber);
        }
    }
    

    【讨论】:

      【解决方案3】:

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

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

      这将使您到达所有节点。然后你只需要确定节点是否是叶子,并弄清楚如何计算平均值(提示:传递深度,跟踪到目前为止找到的叶子的深度总和,以及找到的叶子总数远)。

      【讨论】:

      • 我之前已经做过这个,但我仍然不知道如何前进。如何检测我在哪个级别,如何计算所有级别以及如何计算所有叶子?尤其是当我只能向递归函数发送一个参数时。
      猜你喜欢
      • 1970-01-01
      • 2012-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多