我有一个树形结构。
class Element {
private List<Element> children;
}
Element treeStructure = produceSomeTreeStructure();
//How to get its height and number of elements.
直接解决方案是制作两个循环。首先,我可以找到节点数
A question on getting number of nodes in a Binary Tree (将此算法更改为非二叉树),
和第二个循环来获得树的高度 http://www.geeksforgeeks.org/iterative-method-to-find-height-of-binary-tree/
再次,将此算法应用于非二叉树。
我的问题,如何一步到位。我可以将结果保存在全局变量中。
答案 0 :(得分:3)
如果你想知道节点的数量,那么你需要探索整个树。最简单的方法是使用深度优先搜索,您可以随时计算节点数。
深度优先搜索算法还可以轻松地计算其当前正在探索的深度,并且总体上达到最大深度。修改深度优先搜索算法,将这两个算法作为参数。
如果你以递归方式编码(最简单),那么每次进行递归调用时,只需在深度参数中添加一个。如果这给你的数字大于你追踪的最大值,那么将最大值更新为当前深度。
答案 1 :(得分:2)
是的,可以按照下面的代码显示。只需添加计数器totalNodeCount
,并在每次遍历BFS样式的节点时执行+1
。
// Iterative method to find height and node-count of Binary Tree
int treeHeightAndNumOfNodes(node *root)
{
// Base Case
if (root == NULL)
return 0;
// Create an empty queue for level order tarversal
queue<node *> q;
// Enqueue Root and initialize height
q.push(root);
int height = 0;
int totalNodeCount = 0; // <-- Use this counter to store total number of node traversed.
while (1)
{
// nodeCount (queue size) indicates number of nodes
// at current lelvel.
int nodeCount = q.size();
if (nodeCount == 0)
return height;
height++;
// Dequeue all nodes of current level and Enqueue all
// nodes of next level
while (nodeCount > 0)
{
node *node = q.front();
q.pop();
if (node->left != NULL)
q.push(node->left);
if (node->right != NULL)
q.push(node->right);
nodeCount--;
totalNodeCount++; // <-- Update this counter
}
}
}
再次,将此算法应用于非二叉树。
为此,请使用遍历每个子节点的循环替换下面给定的代码行,并将NON-NULL子节点推入队列。
if (node->left != NULL)
q.push(node->left);
if (node->right != NULL)
q.push(node->right);
答案 2 :(得分:1)
您正在寻找的有点像BFS。你只需像以下一样走你的树:
int getTotalCount(Element e) {
int total_count = 0;
for (Element child : e.children) {
total_count += getTotalCount(el);
}
return total_count + 1;
}
同样,获取元素总数很容易:不是在节点的子节点中获得最大值,而是将它们添加起来。
{{1}}
如果必须使用相同的函数返回这两个数字,只需将它们打包在一个公共类中,只遍历一次树。
答案 3 :(得分:0)
谢谢你的回答。
这就是我编码的内容。
public static TreeData countElementsAndFindHeight(Element root) {
TreeData treePair = new TreeData();
if (root == null) {
return treePair;
}
treePair.nElements = 1;
treePair.height = 1;
//Nodes queue will contain all the elements of the trees, so its size is the number of elements.
List<Element> nodesQueue = new LinkedList<Element>();
treePair.walkedNodes = nodesQueue;
List<Element> children = root.getChildren();
if (CommonUtils.isCollectionEmpty(children)) {
return treePair;
}
treePair.height = countElementsAndFindHeight(root, nodesQueue);
nodesQueue.add(root);
treePair.nElements = nodesQueue.size();
return treePair;
}
private static int countElementsAndFindHeight(Element root, List<Element> nodesQueue) {
int maxHeight = 1;
List<Element> children = root.getChildren();
if (CommonUtils.isCollectionEmpty(children)) {
return maxHeight;
}
for (Element childElement : children) {
int childHeight = countElementsAndFindHeight(childElement, nodesQueue);
if (childHeight > maxHeight) {
maxHeight = childHeight;
}
nodesQueue.add(childElement);
}
return maxHeight + 1;
}
public static class TreeData {
protected int height = 0;
protected int nElements = 0;
}