アルゴリズムとデータ構造の復習を行っています。
木の深さと高さの概念について混乱しています。多くの場合、特に面接クイズに焦点を当てたサイトでは、これらの用語は同じ意味で使用されているように思われます。
基本的な文献では、それらをnodeおよびnotツリーに適用できると定義しているように思われます。
したがって、ルート(ノード)の深さは0
です。ルート(または任意のサブノード)の高さは、その子の最大の高さです。
しかし、これらの用語を木に適用する場合、つまり木の最大の深さを見つける場合、これらの用語は「意味がない」ように見え、同じ意味で使用できます。つまり、最大の深さを見つけるには、最大の高さを計算するだけです。
たとえば、この投稿では ツリーのバランスが取れているかどうかを確認してください 答えはツリーの高さに焦点を当てていますが、バランスの定義はツリーの深さにある可能性があります
私の理解は正しいですか、それとも私はこれらの基本を台無しにしていますか?
ツリーについて話すとき、それらは同じことを意味します:ルートからリーフノードまでの最長のパスの長さ。
次の例のように、depthは通常、ツリーノードのプロパティを説明するために使用され、heightはツリー全体のプロパティを説明するために使用されます。
ツリーの高さは、その最も深いノードの深さとして定義されます。
ノードのheightは、そのノードからリーフまでの最長の下向きパスの長さです。根の高さは木の高さです。
ノードのdepthは、そのルートまでのパスの長さ(つまり、そのルートパス)です。これは、さまざまな自己平衡ツリー、特にAVLツリーの操作で一般的に必要になります。ルートノードの深さはゼロ、リーフノードの高さはゼロ、ノードが1つしかないツリー(したがって、ルートとリーフの両方)の深さと高さはゼロです。従来、空のツリー(ノードが許可されている場合はノードのないツリー)の深さと高さは-1です。
深さは「ノードの深さ」[またはルートからの距離]です。高さは「木の高さ」[または、木から最も遠い葉までの距離]です。
正式に:
height(v) = 0 v is a leaf
max{height(u)|for every u such that u is a son of v} + 1 else
depth(v) = 0 v root
depth(u) + 1 where u is the parent of v else
[〜#〜] edit [〜#〜]:最大深度の概念を参照する場合、それは木の高さと同じです[ルートで最大]、次のようにして証明できます。誘導。
二分探索木で
ノードの深さ:ルートからノードまでのパスの長さです。ノードの高さ:ノードから最も内側のノード(リーフ)までのパスの長さです。
しかし、木の場合の高さと深さは同じです。木の高さ=木の深さ=最大の高さ=最大の深さ。
private static int getHeight(BTreeNode n){
if(n == null)
return 0;
int lHeight = getHeight(n.left);
int rheight = getHeight(n.right);
int height = 1+Math.max(lHeight,rheight);
return height;
}
Nodeの高さはリーフを参照しています-ソースノードからリーフノードへの最長パスの長さです。
Nodeの深さはルートノードを基準にしています。-ソースノードからルートまでの全長
しかし、一般的にツリー全体について話している場合、両方とも同じことを指します。ツリー内の特定のノードを取得した場合にのみ異なります。
木の高さは、最長のパスをたどる根から葉までのノードの数です。したがって、ノード(ルート自体)が1つある場合、height = 1空のツリー:0
また、ノードの深さまたはレベルは、ルートノードからそのノードまでのエッジの数です。したがって、ルートの深さは0です。
このように、木の最大の深さは木の高さより1つ少なくなります。