给你一棵以 root 为根的二叉树和一个整数 target ,请你删除所有值为 target 的 叶子节点 。
注意,一旦删除值为 target 的叶子节点,它的父节点就可能变成叶子节点;如果新叶子节点的值恰好也是 target ,那么这个节点也应该被删除。
也就是说,你需要重复此过程直到不能继续删除。
解答:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
TreeNode* removeLeafNodes(TreeNode* root, int target) {
if(root==NULL) return NULL;
root->left = removeLeafNodes(root->left,target);
root->right = removeLeafNodes(root->right,target);
if(root->left==NULL&&root->right==NULL) {
return root->val==target?NULL:root;
}
return root;
}
};
思考:由于我们需要删除所有值为 target 的叶子节点,那么我们的操作顺序应当从二叉树的叶子节点开始,逐步向上直到二叉树的根为止。因此我们可以使用递归的方法遍历整颗二叉树,并在回溯时进行删除操作。这样对于二叉树中的每个节点,它的子节点一定先于它被操作。这其实也就是二叉树的后序遍历。
具体地,当我们回溯到某个节点 u 时,如果 u 的左右孩子均不存在(这里有两种情况,一是节点 u 的孩子本来就不存在,二是节点 u 的孩子变成了叶子节点并且值为 target,导致其被删除),并且值为 target,那么我们要删除节点 u,递归函数的返回值为空节点;如果节点 u 不需要被删除,那么递归函数的返回值为节点 u 本身。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/delete-leaves-with-a-given-value
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。