814. Binary Tree Pruning

LeetCode original: C# #csharp #leetcode #tree #two-pointers
選択した UI 言語に合わせて問題文をロシア語から翻訳します。コードは変更しません。

: medium

Дан корень бинарного дерева. return то же 木, в котором удалены все поддеревья (данного дерева), не содержащие 1.

Под木 узла node - это сам узел node и все узлы, являющиеся потомками node.

例:

Input: root = [1,null,0,0,1]

Output: [1,null,0,null,1]

Explanation:

Only the red nodes satisfy the property "every subtree not containing a 1".

The diagram on the right represents the answer.

C# 解法

照合済み/オリジナル
public class TreeNode {
    public int val;
    public TreeNode left;
    public TreeNode right;
    public TreeNode(int val = 0, TreeNode left = null, TreeNode right = null) {
        this.val = val;
        this.left = left;
        this.right = right;
    }
}
public class Solution {
    public TreeNode PruneTree(TreeNode root) {
        return ContainsOne(root) ? root : null;
    }
    private bool ContainsOne(TreeNode node) {
        if (node == null) return false;
        bool leftContainsOne = ContainsOne(node.left);
        bool rightContainsOne = ContainsOne(node.right);
        if (!leftContainsOne) node.left = null;
        if (!rightContainsOne) node.right = null;
        return node.val == 1 || leftContainsOne || rightContainsOne;
    }
}

C++ 解法

自動ドラフト、提出前に確認
#include <bits/stdc++.h>
using namespace std;

// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
public class TreeNode {
    public int val;
    public TreeNode left;
    public TreeNode right;
    public TreeNode(int val = 0, TreeNode left = null, TreeNode right = null) {
        this.val = val;
        this.left = left;
        this.right = right;
    }
}
class Solution {
public:
    public TreeNode PruneTree(TreeNode root) {
        return ContainsOne(root) ? root : null;
    }
    private bool ContainsOne(TreeNode node) {
        if (node == null) return false;
        bool leftContainsOne = ContainsOne(node.left);
        bool rightContainsOne = ContainsOne(node.right);
        if (!leftContainsOne) node.left = null;
        if (!rightContainsOne) node.right = null;
        return node.val == 1 || leftContainsOne || rightContainsOne;
    }
}

Java 解法

照合済み/オリジナル
class Solution {
    public TreeNode pruneTree(TreeNode root) {
        return containsOne(root) ? root : null;
    }

    private boolean containsOne(TreeNode node) {
        if (node == null) return false;
        
        boolean leftContainsOne = containsOne(node.left);
        boolean rightContainsOne = containsOne(node.right);

        if (!leftContainsOne) node.left = null;
        if (!rightContainsOne) node.right = null;
        
        return node.val == 1 || leftContainsOne || rightContainsOne;
    }

JavaScript 解法

照合済み/オリジナル
var pruneTree = function(root) {
    if (containsOne(root)) {
        return root;
    }
    return null;
};

var containsOne = function(node) {
    if (!node) return false;

    let leftContainsOne = containsOne(node.left);
    let rightContainsOne = containsOne(node.right);

    if (!leftContainsOne) node.left = null;
    if (!rightContainsOne) node.right = null;

    return node.val === 1 || le

Python 解法

照合済み/オリジナル
class Solution:
    def pruneTree(self, root):
        def containsOne(node):
            if not node:
                return False
            
            leftContainsOne = containsOne(node.left)
            rightContainsOne = containsOne(node.right)
            
            if not leftContainsOne:
                node.left = None
            if not rightContainsOne:
                node.right = None
            
            return node.val == 1 or leftContainsOne or rightContainsOne
        
        return root if containsOne(root) else None

Algorithm

Используем функцию containsOne(node), которая сообщает, содержит ли под木 в данном узле единицу, и обрезает все поддеревья, не содержащие единицу.

На例, если под木 node.left не содержит единицу, то мы должны обрезать его через node.left = null.

Также нужно проверить родительский узел. На例, если 木 состоит из одного узла 0, то ответом будет пустое 木.

😎

Vacancies for this task

有効な求人 with overlapping task tags are 表示.

すべての求人
有効な求人はまだありません。