leetcode 538.把二叉搜索树转换为累加树
这个错误是因为在尝试访问一个空指针的成员,在right->val
这一行对right
这个指针进行了解引用操作。但是,如果right
是一个空指针(也就是nullptr
),这就会导致错误。
错误修改:
- 先判断是否为空再访问root->val,这里是在操作返回值,但是返回值可能是空的!
- 实际上这种写法还存在逻辑上的问题,我们本题递归遍历的时候应该直接累加所有遍历过的值,而不是只累加右节点
if(right!=nullptr){
root->val = right->val+root->val;
}
本题正确解法
需要注意一点, 当前的遍历顺序已经是倒着的中序遍历了! 得到的就是递减的结果。
因此我们在处理中节点的逻辑的时候, 并不是只加右子树, 而是应该设置全局变量。把目前为止遍历过的所有的节点值都加上。
class Solution {
public:
int sum = 0;
TreeNode* convertBST(TreeNode* root) {
if(root==nullptr){
return nullptr;
}
//倒着的中序遍历
//右
TreeNode* right = convertBST(root->right);
//连接右
root->right = right;
//中,累加
sum += root->val;
root->val = sum;
//左
TreeNode* left = convertBST(root->left);
//连接左
root->left = left;
return root;
}
};