Как изменить двоичное дерево? - PullRequest
0 голосов
/ 07 мая 2020

Итак, в основном мне задали этот вопрос: https://leetcode.com/problems/delete-leaves-with-a-given-value/

Учитывая двоичное дерево root и целочисленную цель, удалите все конечные узлы со значением target .

Обратите внимание, что после удаления листового узла с целевым значением, если его родительский узел становится листовым узлом и имеет целевое значение, он также должен быть удален (вам нужно продолжать делать это до тех пор, пока вы не сможете ).

Мое решение было:

TreeNode* removeLeafNodes(TreeNode* root, int target) {
        if (!root)
            return nullptr;
        TreeNode* checkLeft = removeLeafNodes(root->left, target);
        TreeNode* checkRight = removeLeafNodes(root->right, target);
        if (!checkLeft and !checkLeft and root->val == target){
            root = nullptr;
        }
       return root;    
    }

Однако это не изменило исходное дерево.

Правильный код:

TreeNode* removeLeafNodes(TreeNode* root, int target) {
        if (!root)
            return nullptr;
        root->left = removeLeafNodes(root->left, target);
        root->right = removeLeafNodes(root->right, target);
        if (!root->left and !root->right and root->val == target){
            root = nullptr;
        }
       return root;    
    }

Как мое не меняет исходное дерево?

1 Ответ

0 голосов
/ 07 мая 2020

Чтобы изменить входное значение true, вам необходимо изменить узлы left и right переданного указателя. Поскольку вы этого не делаете, ваш код работает только тогда, когда переданное дерево имеет единственный узел.

Чтобы изменить root->left и root->right, вам необходимо обновить их, используя возвращаемые значения рекурсивных вызовов, как написано в правильной версии.

...