バイナリツリーの直径。質問の意味は、バイナリツリー内部の最大直径を見つけ、バイナリツリーを与えることです。これは、最大径が任意の二つのノード間の最大距離で定義します。例、
バイナリツリーを考えます
1 / \ 2 3 / \ 4 5
経路の長さであるリターン3、[4,2,1,3]又は[5,2,1,3]。
この最大距離はルートなし可能性があることに注意してくださいは、図中の以下の実施例は、最大径は、9-8である中国のネットワークLCから採取します
アイデアはに似ている104タイトルに使用再帰バイナリーツリーの最大の深さを見つけるために、少しいくつかの変更を行います。左部分木の最大の深さのレコードがグローバル変数RES最大長を設定し、再帰関数は、まだ解像度の最大深レコードを探していますがMath.max(RES、右+左)とされ 、 現在のノードの右部分木+最大深さです。
時間O(N)
スペースO(n)は、
Java実装
1 クラスソリューション{ 2つ のint RES = 0 。 3 4 公共 INT diameterOfBinaryTree(ツリーノードのルート){ 5 ヘルパー(ルート)。 6 リターンのres; 7 } 8 9 プライベート int型ヘルパー(ツリーノードのルート){ 10 であれば(ルート== NULL ){ 11 リターン 0 。 12 } 13 INTは =左(root.left)ヘルパー。 14 INT右= ヘルパー(root.right)。 15 RES = Math.max(RES、+左、右)。 16 リターン Math.max(左、右)+ 1 。 17 } 18 }
JavaScript実装
1 / * * 2 * @param {ツリーノード}ルート 3 * @return {数} 4 * / 5 のvar diameterOfBinaryTree = 関数(ルート){ 6つの LETのRES = 0 。 7 VaRのヘルパー= 関数(ルート){ 8 であれば(ルート== NULL ){ 9 戻り 0 ; 10 } 11 LETは=左(root.left)ヘルパー。 12は 右=聞かせヘルパー(root.right)。 13の RES = Math.max(RES、左+正しい); 14 リターン Math.max(左、右)+ 1 。 15 }。 16 ヘルパー(ルート)。 17 リターンのres; 18 }。