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