我々は下方にそのノードLの最大数(サブツリー深さの根の、すなわち、左息子)を通過した後、ノードの左側の子および右側の子は(すなわち右息子に最もノードRを介して下方にトラバースされることを知っていると仮定サブツリーのルートの深さ)は、そのノードへのパスの始点ノードの最大数を通過するときには、L + R + 1であります
我々は、パスの開始点として、ノードノードは、ノードの最大数通過注意するバイナリツリーの直径は、すべてのノードdnodeマイナス1の最大値であり、dnodeあります。
最終的アルゴリズム処理:我々は定義再帰関数の深さ(ノード)関数は、サブツリーのルートのノード計算dnode深度を返します。左右の息子息子深さLとRRに再帰呼び出しは、決定されたサブツリーのルートであるサブツリーのルートノードの深さ、MAX(L、R)+1であり; dnodeのノードの値であります L + R + 1 再帰的にすべてのノードを検索し、グローバル変数レコードANS設定 dnode 最も大きな値を、そして最終的にANS-1を返すには、木の直径です。
リンクします。https://leetcode-cn.com/problems/diameter-of-binary-tree/solution/er-cha-shu-de-zhi-jing-by-leetcode-solution/
1 / * * 2 分木のノードのための*の定義。 3 *構造体のTreeNode { 4 * INTヴァル。 5 *のTreeNode *左; 6 *のTreeNode *右; 7 *ツリーノード(INT X):ヴァル(x)は、左(NULL)、右(NULL){} 8 *}。 9 * / 10 クラスソリューション{ 11 公共: 12 int型の長さ= 0 。 13 INT diameterOfBinaryTree(ツリーノード* ルート){ 14 の深さ(ルート)。 15 戻り長。 16 } 17 int型の深さ(ツリーノード* ルート) 18 { 19 のint L =深さ(root-> 左)。 20 のint R =深さ(root- 右)。 21 長さ= MAX(L + R、長さ)。 22 リターン MAX(L、R)+ 1 。 23 } 24 }。