私は二分木を持っています
2
/ \
3 4
/ \ \
5 1 8
/ \ / \
1 6 9 2
\
4
maximum possible triangular chord info sum
指定されたツリー内のノード (任意の 2 つの葉と左右の両方の子を持つノードの間)を見つけたいです。
三角形のコードは
三角弦の場合:
任意の 2 つの葉の間の線を想像して、根に向かって上に進み、共通の親 (親、祖父母、祖父母、または根自体でさえあります) を見つけます。上に移動している間、各葉について (どの葉についても、左、左、左だけを上に移動する必要があるか、または、右、右、右のみ、など) を意味します (左の葉はright
上のみ、右のみを移動します)。葉はleft
上向きにのみ移動します....だから、任意の単一の葉の場合、we can not move in both direction while moving upwards
..今、三角形の形を取得しますa side may contain any no. of nodes/links possible
.. triangular shape does not contain any extra internal branches
その三角形の形が三角弦になります。
覚えておいてくださいevery leaf node is also always a triangular chord
(二分木に三角形の弦がない場合にデフォルトのケースを作成するだけです)
今
maximum triangular chord will be that triangular chord
which have maximum total in sum of all its node info.
私たちはする必要がありますreturn that maximum total.
If we do not have triangular shaped chord..
then we have to return the leaf with maximum info.
例えば
8
/ \
2 3
\
3
三角弦です
8
/ \
2 3
\ \
4 1
単一ノード 4 を持つサブツリーのみが最大三角弦になります (その合計は単一ノード 1 を持つ別の三角弦よりも大きいため) ツリー全体が三角弦になるわけではありません
8
/ \
2 3
/ \
4 3
三角弦です
したがって、問題の最初の行の最初のツリーの解は
8+9+2+4 = 23
私はこの問題にひどく閉じ込められています。
私は大まかなアプローチをしています
サブツリーのルートとして leftchild を再帰的に呼び出し、サブツリーのルートとして rightchild と同じ左の最大三角和音を見つけます。
leftmax と rightmax の最大値を追加し、rood ノードに追加して戻ります
C ++のmycodeは次のとおりです。
int maxtri(node* n)
{
if(n)
{
lsum = maxtri(n->left);
rsum = maxtri(n->right);
k = maxof(lsum,rsum);
return (n->info + k);
}
}
編集:私の別の再帰的アプローチ
int l =0, r =0;
int maxtri(node* n)
{
if (n == NULL) return 0;
if (!(n->left) && !(n->right)) return n->info;
if ((n->left) && (n->right))
{
l = maxtri(n->left);
r = maxtri(n->right);
}
if ((n->left) && !(n->right))
{
l = l + maxtri(n->left);
}
if (!(n->left) && (n->right))
{
r = r + maxtri(n->right);
}
return (l+r+n->info);
}
私は自分のアプローチに疑問を持っています。
誰かが別の解決策を与えることができますか??