Pythonでノードを削除してフォレストを返す
二分木のルートがあるとすると、ツリー内の各ノードには一意の値があります。 to_deleteの値を持つすべてのノードを削除すると、フォレストが残ります。残りの森で木の根を見つけなければなりません。したがって、入力が次のような場合
to_delete配列が[3,5]のような場合、出力は
になります。
これを解決するには、次の手順に従います-
- 配列解像度を定義する
- メソッドsolve()を定義します。これにより、ノード、to_delete配列、およびノードがルートであるかどうかを示すブール型の情報が取得されます。メソッドは以下のように動作します-
- ノードがnullの場合、nullを返します
- フラグ:=ノードの値がto_delete配列にある場合はtrue
- フラグがfalseでis_rootがtrueの場合、ノードをresに挿入します
- ノードの左側:=solve(ノードの左側、to_delete、フラグ)
- ノードの権利:=solve(ノードの権利、to_delete、フラグ)
- フラグが設定されている場合はnoneを返し、それ以外の場合はfalseを返します
- resolve(node、to_delete、true)などのメインメソッドからsolve()メソッドを呼び出します
理解を深めるために、次の実装を見てみましょう-
例
class Solution(object): def delNodes(self, root, to_delete): """ :type root: TreeNode :type to_delete: List[int] :rtype: List[TreeNode] """ to_delete = set(to_delete) self.res = [] self.solve(root,to_delete,True) return self.res def solve(self,node,to_delete,is_root): if not node: return None flag = node.val in to_delete if not flag and is_root: self.res.append(node) node.left = self.solve(node.left,to_delete,flag) node.right = self.solve(node.right,to_delete,flag) return None if flag else node
入力
[1,2,3,4,5,6,7] [3,5]
出力
[[1,2,null,4],[6],[7]]
-
Pythonでバイナリツリーのリーフノードと非リーフノードを検索するプログラム
二分木があるとすると、2つの数字のリストを見つける必要があります。最初の数字はツリー内の葉の数で、2番目の数字は非葉ノードの数です。 したがって、入力が次のような場合 3つのリーフと2つの非リーフノードがあるため、出力は(3、2)になります。 これを解決するには、次の手順に従います- nがnullの場合、 return(0、0) nの左側がnullで、nの右側がnullの場合、 return(1、0) 左:=ソルブ(nの左) right:=resolve(right of n) return(left [0] + right [0]、1 + left [1]
-
Pythonでプレオーダーおよびポストオーダートラバーサルからバイナリツリーを構築する
PreorderとPostorderの2つのトラバーサルシーケンスがあるとすると、これら2つのシーケンスからバイナリツリーを生成する必要があります。したがって、シーケンスが[1,2,4,5,3,6,7]、[4,5,2,6,7,3,1]の場合、出力はになります。 これを解決するには、次の手順に従います- ans:=値pre [0]を取得してツリーノードを作成し、スタック:=空のスタックを作成し、ansを挿入します i:=1およびj:=0 whilei<前の長さとj<後の長さ スタックの最上位値=post[j]の場合、jを1増やし、スタックからポップして、次の反復に進みます n