Rád bych vypočítat součty hloubi každého uzlu strom binárního vyhledávání.
Jednotlivé hloubky prvků již nejsou uloženy.
Rád bych vypočítat součty hloubi každého uzlu strom binárního vyhledávání.
Jednotlivé hloubky prvků již nejsou uloženy.
Pro jakýkoli daný stromu, počet uzlů je 1 pro kořenové plus počet uzlů v levém podstromu plus počet uzlů v pravém podstromu :)
Detaily, jako je ujistit se, že ve skutečnosti je levý nebo pravý subtree, jsou „ponechána na čtenáře“.
Něco takového:
int countChildren(Node node)
{
if ( node == null )
return 0;
return 1 + countChildren(node.getLeft()) + countChildren(node.getRight());
}
A získat součet hloubky každého dítěte:
int sumDepthOfAllChildren(Node node, int depth)
{
if ( node == null )
return 0; // starting to see a pattern?
return depth + sumDepthOfAllChildren(node.getLeft(), depth + 1) +
sumDepthOfAllChildren(node.getRight(), depth + 1);
}
Nyní doufejme informativní vysvětlení v případě, že to je domácí úkol. Počítání počtu uzlů je poměrně jednoduché. Za prvé, v případě, že uzel není uzel ( node == null) vrací 0. Pokud se jedná o uzel, nejprve počítá svůj vlastní (dále 1), plus počet uzlů v levém podstromu plus počet uzlů v jeho právo sub-tree. Další způsob, jak myslet na to je navštívit každý uzel prostřednictvím BFS, a přidat jeden až počítat pro každý uzel, kterou navštívíte.
Součet hloubek je podobná, s výjimkou namísto přidání jen jeden pro každý uzel, uzel dodává hloubku jeho vlastní. A to zná hloubku svého já, protože jeho mateřský to řekl. Každý uzel ví, že hloubka je to děti mají svou vlastní hloubku plus jedna, takže když se dostanete do hloubky levých a pravých dětí uzlu, řekni jim jejich hloubka je hloubka aktuálního uzlu plus 1.
A opět, pokud uzel není uzel, nemá hloubku. Chcete-li tedy součet hloubky všech dětí kořenového uzlu je předáte do kořenového uzlu a hloubce kořenového uzlu je jako tak:sumDepthOfAllChildren(root, 0)
Rekurze je docela užitečné, je to jen velmi odlišný způsob uvažování o věcech a vyžaduje praxi, aby si zvykli na to
public int numberOfNodes()
{
// This node.
int result = 1;
// Plus all the nodes from the left node.
Node left = getLeft();
if (left != null)
result += left.numberOfNodes();
// Plus all the nodes from the right node.
Node right = getRight();
if (right != null)
result += right.numberOfNodes();
return result;
}
public int countNodes(Node root)
{
// Setup
// assign to temps to avoid double call accessors.
Node left = root.getLeft();
Node right = root.getRight();
int count = 1; // count THIS node.
// count subtrees
if (left != null) count += countNodes(left);
if (right != null) count += countNodes(right);
return count;
}
public class Node {
private Node left;
private Node right;
public int size() { return 1+ (left==null?0:left.size())+ (right==null?0:right.size());}
}
private static int getNumberOfNodes(Node node) {
if (node == null) {
return 0;
}
return 1 + getNumberOfNodes(node.left) + getNumberOfNodes(node.right);
}
int depth(treenode *p)
{
if(p==NULL)return(0);
if(p->left){h1=depth(p->left);}
if(p=>right){h2=depth(p->right);}
return(max(h1,h2)+1);
}
int maxDepth(Node node) {
if (node == null) {
return (-1); // an empty tree has height −1
} else {
// compute the depth of each subtree
int leftDepth = maxDepth(node.left);
int rightDepth = maxDepth(node.right);
// use the larger one
if (leftDepth > rightDepth )
return (leftDepth + 1);
else
return (rightDepth + 1);
}
}
public int getDepthHelper( TreeNode< T > node ) {
int treeHeightLeft;
int treeHeightRight;
//get height of left subtree
if( node.leftNode == null )
treeHeightLeft = 1;
else {
treeHeightLeft = getDepthHelper( node.leftNode) + 1;
}
//get height of right subtree
if( node.rightNode == null )
treeHeightRight = 1;
else {
treeHeightRight = getDepthHelper( node.rightNode) + 1;
}
return Math.max(treeHeightLeft, treeHeightRight);
}
Toto řešení je ještě jednodušší.
public int getHeight(Node root)
{
if(root!=null)
return 1+ Math.max(getHeight(root.leftchild),getHeight(root.rightchild));
else
return 0;
}