c++ - 如何修改二叉树?
问题描述
所以基本上我被提出了这个问题:https ://leetcode.com/problems/delete-leaves-with-a-given-value/
给定一个二叉树根和一个整数目标,删除所有具有目标值的叶节点。
请注意,一旦您删除了具有值目标的叶节点,如果它的父节点成为叶节点并具有值目标,则它也应该被删除(您需要继续这样做,直到不能删除为止)。
我的解决方案是:
TreeNode* removeLeafNodes(TreeNode* root, int target) {
if (!root)
return nullptr;
TreeNode* checkLeft = removeLeafNodes(root->left, target);
TreeNode* checkRight = removeLeafNodes(root->right, target);
if (!checkLeft and !checkLeft and root->val == target){
root = nullptr;
}
return root;
}
但是,这并没有修改原始树。
正确的代码是:
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 and !root->right and root->val == target){
root = nullptr;
}
return root;
}
我的怎么不改变原来的树?
解决方案
要修改输入 true,您需要修改传入指针的left
、 和right
节点。由于您不这样做,因此您的代码唯一有效的时间是传入的树有一个节点。
要修改root->left
和root->right
,您需要使用递归调用的返回值更新它们,如正确版本中所写。
推荐阅读
- python - bakeResults 也在烘焙其他属性
- pyspark - 如何在pyspark中加载databricks包dbutils
- javascript - 提交表单并检查用户名是否重复后,如何将此信息发送到表单页面上的 javascript?
- mysql - 由于不存在的约束,无法在 MariaDB 中创建表
- c++ - 如何使用 vector.begin() 和 vector.end() 遍历矩阵?
- xamarin.forms - 来自 xaml 的自定义渲染器的 Xamarin 访问属性
- reactjs - 如何使用 webpack 和 babel 建立项目?
- linux - 对等点重置连接后 Wget 不重试
- active-directory - OfficeJs SSO getAccessTokenAsync 返回错误代码 3000,访问被拒绝
- android - 跟踪播放 Instream FAN 视频广告的进度