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