LeetCode 题解 | 1325. 删除给定值的叶子节点(自底向上递归 C++)

题目描述

原题链接
在这里插入图片描述

算法

(自底向上 递归) O ( n ) O(n)

二叉树删除结点和链表删除结点是类似的,都是找到前驱结点,例如要删除root的左子树,只需root->left = NULL

  • 我们需要删除所有值为 target 的叶子节点,那么我们的操作顺序应当从二叉树的叶子节点开始,逐步向上直到二叉树的根为止
  • 常见的二叉树遍历中,后序遍历是先遍历完所有子结点之后再遍历根结点,符合题意
  • 所以对于结点root,我们先处理完它的左子树和右子树,然后再判断root要不要删除,如果root的左子树递归后返回NULL,右子树递归后也返回NULL,且root->val = target,那么root就要被删除,也就是返回NULL;否则返回root即可

时间复杂度是 O ( n ) O(n) :每个结点最多遍历一次,空间复杂度是 O ( n ) O(n) :需要额外的系统栈空间

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;
    }
};

写在最后:我的博客主要是对计算机领域所学知识的总结、回顾和思考,把每篇博客写得通俗易懂是我的目标,分享技术和知识是一种快乐 ,非常欢迎大家和我一起交流学习,有任何问题都可以在评论区留言,也期待与您的深入交流(^∀^●)

发布了239 篇原创文章 · 获赞 80 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/qq_43827595/article/details/104262588