563.二分木の傾きの再帰的な使用

正直なところ、再帰+バックトラッキングは非常に単純で難しいです。この文章は私が最も深く感じているものです。時々、それは私の脳内の非常に単純な再帰であり、実装するのが非常に面倒です。木の再帰について話しましょう。それは心に留めておくべきですが、特定の問題を解決する方法、トピックをリストしてください:

これは良い感じです。つまり、各ノードは、左側のサブツリーの値から右側のサブツリーの絶対値を引いた値で実行されますが、この質問では、最初から始めます。再帰を使用した場合、何が発生するでしょうか。問題?つまり、各ノードの左サブツリーと右サブツリーの値を計算する必要があります。そうすると、問題が発生します。下から上へと再帰的に考えたい場合があります。ノードの最後のレイヤーは、左右の絶対値でなければなりません。

サブツリーノードの合計が繰り返し計算されないようにするには、現在のツリーのすべてのノードの合計を返す必要があります。
つまり、ノードが子ノードから返されたノードの合計を取得すると、ノードの勾配がすぐに計算され、インスタンス変数に格納できます。その後、現在のノードのツリーもルートノードとして上向きに返されます。すべてのノードの合計。
このように、ボトムアップのプロセスでは、サブツリーのすべてのノードの合計を継続的に返し、次に現在のノードの勾配を計算して累積し、現在のツリーのノードの合計を上方に返します。ルートノードの勾配が計算されると、再帰的走査が終了し、すべてのノードの勾配の合計が計算されます。

以下にコードを示します。

        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;
        }

 

元の記事を17件公開 賞賛された0 訪問数147

おすすめ

転載: blog.csdn.net/qq_33286699/article/details/105271630