正直なところ、再帰+バックトラッキングは非常に単純で難しいです。この文章は私が最も深く感じているものです。時々、それは私の脳内の非常に単純な再帰であり、実装するのが非常に面倒です。木の再帰について話しましょう。それは心に留めておくべきですが、特定の問題を解決する方法、トピックをリストしてください:
これは良い感じです。つまり、各ノードは、左側のサブツリーの値から右側のサブツリーの絶対値を引いた値で実行されますが、この質問では、最初から始めます。再帰を使用した場合、何が発生するでしょうか。問題?つまり、各ノードの左サブツリーと右サブツリーの値を計算する必要があります。そうすると、問題が発生します。下から上へと再帰的に考えたい場合があります。ノードの最後のレイヤーは、左右の絶対値でなければなりません。
サブツリーノードの合計が繰り返し計算されないようにするには、現在のツリーのすべてのノードの合計を返す必要があります。
つまり、ノードが子ノードから返されたノードの合計を取得すると、ノードの勾配がすぐに計算され、インスタンス変数に格納できます。その後、現在のノードのツリーもルートノードとして上向きに返されます。すべてのノードの合計。
このように、ボトムアップのプロセスでは、サブツリーのすべてのノードの合計を継続的に返し、次に現在のノードの勾配を計算して累積し、現在のツリーのノードの合計を上方に返します。ルートノードの勾配が計算されると、再帰的走査が終了し、すべてのノードの勾配の合計が計算されます。
以下にコードを示します。
int tilt=0;
public int findTilt(TreeNode root) {
traverse(root);
return tilt;
}
public int traverse(TreeNode root)
{
if(root==null )
return 0;
int left=traverse(root.left);
int right=traverse(root.right);
tilt+=Math.abs(left-right);
return left+right+root.val;
}