二分木の高さを計算する理論、通常は表記法について助けが必要です。
次の記事を読みました。
そして、投稿の1つは次の表記を与えます:
高さ(ノード)= max(高さ(ノード.L)、高さ(ノード.R))+ 1
次のバイナリツリーがあるとします。
10
/ \
5 30
/ \ / \
4 8 28 42
したがって、左側のノードの最大値(8)と右側の最大ノード(42)を計算してから、1を追加しますか?木の高さを計算するためにこの表記がどのように機能するのか、私にはよくわかりません。
この再帰的アルゴリズムがどのように機能するかを説明しようと思います:
_height(10) = max(height(5), height(30)) + 1
height(30) = max(height(28), height(42)) + 1
height(42) = 0 (no children)
height(28) = 0 (no children)
height(5) = max(height(4), height(8)) + 1
height(4) = 0 (no children)
height(8) = 0 (no children)
_
したがって、height(10)
を計算する場合は、再帰を下に展開し、結果を逆に置き換える必要があります。
_height(5) = max(0, 0) + 1
height(30) = max(0, 0) + 1
height(10) = max(1, 1) + 1
height(10) = 2
_
編集:
コメントで述べたように:
_height of binary tree = number of layers - 1
_
したがって、空のノードの高さは-1に等しいと想定する必要があります。つまり、
_height(empty) = -1
_
または
_height(null) = -1
_
こちらです
_height(42) = max(height(null), height(null)) + 1
height(42) = max(-1, -1) + 1
height(42) = -1 + 1
height(42) = 0
_
上記の計算を修正しました。
ツリーの高さは、ルートからツリーの最も深いノードまでのパスの長さです。これがそうするための最短のアルゴです
int height(Node root){
if(root == null )
return 0;
return 1+max{height(root.left), height(root.right)};
}
ノードの高さの定義を知っていますか?私はそれに到達可能な葉までの最も遠い距離として答えます(したがってすべての葉は高さ0を持っています)...今度はすべてのノードの高さを下から上に見つけてみてください。
ルートノードを見つけて、uがカバーできる最長のパスを探し(そのパスでカバーできるノードの最大数を意味します)、そのパスを取得したら、カバーしたブランチまたはエッジの数、合計を確認しますあなたがカバーした枝の数は木の高さです
繰り返し質問
再帰の入門としては優れていますが、バイナリツリーの高さに関するすべての不正解に少し驚いているので、正しい解決策を提供したいと思いました。私はいくつかの掘り出し物をしました、そしてこの質問はここで適切に答えられます: https://stackoverflow.com/a/2597754/5567854 。
参照
Wikipedia によると、「ルートノードのみで構成されるツリーの高さは0であり、他の回答状態では1ではありません。したがって、質問の例では:
10
/ \
5 30
/ \ / \
4 8 28 42
そのツリーの高さを求めるルートノードが10の場合、高さは3ではなく2になります。
正しいコード
このソリューションは、C言語で可能な多くのソリューションの1つです...
size_t binary_tree_height(const binary_tree_t *tree)
{
size_t r, l, height = 0;
if (tree)
{
r = tree->right ? binary_tree_height(tree->right) + 1 : 0;
l = tree->left ? binary_tree_height(tree->left) + 1 : 0;
height += (r > l ? r : l);
}
return (height);
}
#include<stdio.h>
#include<stdlib.h>
/* A binary tree node has data, pointer to left child
and a pointer to right child */
struct node
{
int data;
struct node* left;
struct node* right;
};
/* Compute the "maxDepth" of a tree -- the number of
nodes along the longest path from the root node
down to the farthest leaf node.*/
int maxDepth(struct node* node)
{
if (node==NULL)
return 0;
else
{
/* compute the depth of each subtree */
int lDepth = maxDepth(node->left);
int rDepth = maxDepth(node->right);
/* use the larger one */
if (lDepth > rDepth)
return(lDepth+1);
else return(rDepth+1);
}
}
/* Helper function that allocates a new node with the
given data and NULL left and right pointers. */
struct node* newNode(int data)
{
struct node* node = (struct node*)
malloc(sizeof(struct node));
node->data = data;
node->left = NULL;
node->right = NULL;
return(node);
}
int main()
{
struct node *root = newNode(1);
root->left = newNode(2);
root->right = newNode(3);
root->left->left = newNode(4);
root->left->right = newNode(5);
printf("Hight of tree is %d", maxDepth(root));
getchar();
return 0;
}
最初のノード(ROOT)から開始してリーフノードに至るまでに可能なノードの最大数は、ツリーの高さと呼ばれます。木の高さを求める式h = i(max)+1、ここでhは高さ、Iは木の最大レベルです