删除给定值的叶子结点

0x01.问题

给你一棵以 root 为根的二叉树和一个整数 target ,请你删除所有值为 target 的 叶子节点 。
注意,一旦删除值为 target 的叶子节点,它的父节点就可能变成叶子节点;如果新叶子节点的值恰好也是 target ,那么这个节点也应该被删除。
也就是说,你需要重复此过程直到不能继续删除。

C++结构体为:
struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
函数形式为:TreeNode* removeLeafNodes(TreeNode* root, int target)

0x02.要点

  • 要做到删除子结点后,父结点仍可能被删除,得自底向上,说明必须采用后序遍历的方式。
  • 不能直接使用C++的delete,因为题目中有返回值,直接删除会造成内存异常,所以应该返回NULL

0x03.解决代码

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&&!root->right&&root->val==target) return nullptr;
        return root;
    }
    

ATFWUS --Writing By 2020–03–19

发布了126 篇原创文章 · 获赞 142 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/ATFWUS/article/details/104971396