题目描述
算法
(自底向上 递归)
二叉树删除结点和链表删除结点是类似的,都是找到前驱结点,例如要删除root的左子树,只需root->left = NULL
- 我们需要删除所有值为 target 的叶子节点,那么我们的操作顺序应当从二叉树的叶子节点开始,逐步向上直到二叉树的根为止
- 常见的二叉树遍历中,后序遍历是先遍历完所有子结点之后再遍历根结点,符合题意
- 所以对于结点root,我们先处理完它的左子树和右子树,然后再判断root要不要删除,如果root的左子树递归后返回NULL,右子树递归后也返回NULL,且root->val = target,那么root就要被删除,也就是返回NULL;否则返回root即可
时间复杂度是 :每个结点最多遍历一次,空间复杂度是 :需要额外的系统栈空间
C++代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* removeLeafNodes(TreeNode* root, int target) {
if (!root) return nullptr;
// Postorder Traverse
root->left = removeLeafNodes(root->left, target);
root->right = removeLeafNodes(root->right, target);
if (!root->left && !root->right && root->val == target)
return nullptr;
return root;
}
};
写在最后:我的博客主要是对计算机领域所学知识的总结、回顾和思考,把每篇博客写得通俗易懂是我的目标,分享技术和知识是一种快乐 ,非常欢迎大家和我一起交流学习,有任何问题都可以在评论区留言,也期待与您的深入交流(^∀^●)