web-dev-qa-db-ja.com

二分木の高さの計算

二分木の高さを計算する理論、通常は表記法について助けが必要です。

次の記事を読みました。

二分木の高さの計算

そして、投稿の1つは次の表記を与えます:

高さ(ノード)= max(高さ(ノード.L)、高さ(ノード.R))+ 1

次のバイナリツリーがあるとします。

     10
   /   \  
  5    30
 / \   /  \ 
4  8  28  42

したがって、左側のノードの最大値(8)と右側の最大ノード(42)を計算してから、1を追加しますか?木の高さを計算するためにこの表記がどのように機能するのか、私にはよくわかりません。

11
Phorce

この再帰的アルゴリズムがどのように機能するかを説明しようと思います:

_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
_

上記の計算を修正しました。

22
Ondrej Bozek

ツリーの高さは、ルートからツリーの最も深いノードまでのパスの長さです。これがそうするための最短のアルゴです

int height(Node root){
   if(root == null )
       return 0;
   return 1+max{height(root.left), height(root.right)};
}
21
roger_that

ノードの高さの定義を知っていますか?私はそれに到達可能な葉までの最も遠い距離として答えます(したがってすべての葉は高さ0を持っています)...今度はすべてのノードの高さを下から上に見つけてみてください。

2
sethi

ルートノードを見つけて、uがカバーできる最長のパスを探し(そのパスでカバーできるノードの最大数を意味します)、そのパスを取得したら、カバーしたブランチまたはエッジの数、合計を確認しますあなたがカバーした枝の数は木の高さです

2
Dip686

繰り返し質問

再帰の入門としては優れていますが、バイナリツリーの高さに関するすべての不正解に少し驚いているので、正しい解決策を提供したいと思いました。私はいくつかの掘り出し物をしました、そしてこの質問はここで適切に答えられます: 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;
}
0
sankar

最初のノード(ROOT)から開始してリーフノードに至るまでに可能なノードの最大数は、ツリーの高さと呼ばれます。木の高さを求める式h = i(max)+1、ここでhは高さ、Iは木の最大レベルです

0
safi