JZ0047:二叉树剪支

📃 题目描述

题目链接:二叉树剪支相同题目

image-20220512232937992

🔔 解题思路

第一种做法:dfs,思考方式是你站在一个点上怎么做,在一个点上,先看左子树是否要删除,再看看右子树,然后进行删除操作,最后看看自己是不是属于要删除的节点;

class Solution {
public:
    TreeNode* pruneTree(TreeNode* root) {
        return deleteNode(root) ? nullptr : root;
    }

    bool deleteNode(TreeNode* root) {
        if (root == nullptr) return false;
        bool leftDel = deleteNode(root->left);
        bool rightDel = deleteNode(root->right);
        
        if (leftDel) root->left = nullptr;
        if (rightDel) root->right = nullptr;

        // if (root->left == nullptr && root->right == nullptr && root->val == 0) return true;
        // else return false;
        //优化写法:
        return root->val == 0 && !root->left && !root->right;
    }
};

方法二:非递归方式实现,将数据压入栈中,每次拿出,判断这个节点的左孩子、右孩子是不是要删除,需要删除的就删除;

💥 复杂度分析

  • 时间复杂度:o(n);
  • 空间复杂度:O(n);
posted @ 2022-05-13 00:29  D-booker  阅读(39)  评论(0编辑  收藏  举报