二分探索木の各ノードの深さの合計を計算したいと思います。
要素の個々の深さはまだ保存されていません。
このようなもの:
_int countChildren(Node node)
{
if ( node == null )
return 0;
return 1 + countChildren(node.getLeft()) + countChildren(node.getRight());
}
_
そして、すべての子供の深さの合計を取得するには:
_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);
}
_
これが宿題である場合に備えて、情報提供に役立つ情報を提供します。ノード数のカウントは非常に簡単です。まず、ノードがノード(_node == null
_)でない場合は、0を返します。ノードの場合、まずノード自体(_1
_)にノードの数を加えたものをカウントします。左のサブツリーとその右のサブツリーのノード数。それを考えるもう1つの方法は、BFSを介してすべてのノードにアクセスし、アクセスするすべてのノードのカウントに1を追加することです。
深度の合計も同様ですが、ノードごとに1つだけ追加するのではなく、ノードが自身の深度を追加します。そして、その親がそれを言ったので、それは自己の深さを知っています。各ノードは、その子の深さがそれ自体の深さ+ 1であることを認識しているため、ノードの左右の子の深さを取得するとき、それらの深さが現在のノードの深さ+ 1であることを伝えます。
また、ノードがノードでない場合、深さはありません。したがって、すべてのルートノードの子の深度の合計が必要な場合は、ルートノードとルートノードの深度を次のように渡します:sumDepthOfAllChildren(root, 0)
再帰は非常に便利です。それは物事についての非常に異なる考え方であり、慣れるために練習が必要です
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);
}
}
特定のツリーでは、ノードの数は、ルートの1に、左のサブツリーのノードの数と右のサブツリーのノードの数を足したものです:)
実際に存在することを確認するなどの詳細is左側または右側のサブツリーは、「読者に委ねられています」。
このソリューションはさらに簡単です。
public int getHeight(Node root)
{
if(root!=null)
return 1+ Math.max(getHeight(root.leftchild),getHeight(root.rightchild));
else
return 0;
}
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);
}
public class Node {
private Node left;
private Node right;
public int size() { return 1+ (left==null?0:left.size())+ (right==null?0:right.size());}
}
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;
}