JZ0047:二叉树剪支
📃 题目描述
🔔 解题思路
第一种做法: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);