538. 把二叉搜索树转换为累加树 - 力扣(LeetCode) (leetcode-cn.com)
二叉搜索树转换为累加树
递归
- 重要思想: 前序中序后序不是唯一,
- 按我们的想法选择 中 左 右, 中 右 左, 左 中 右, 右 中 左, 左 右 中, 右 左 中 合适的来解
class Solution {
public:
int pre;
void traversal(TreeNode* cur) {
// 递归边界
if (!cur) return;
// 逆中序遍历递归体
traversal(cur->right);
cur->val += pre;
pre = cur->val;
traversal(cur->left);
}
TreeNode* convertBST(TreeNode* root) {
pre = 0;
traversal(root);
return root;
}
};
非递归
- 逆中序遍历
class Solution {
public:
TreeNode* convertBST(TreeNode* root) {
if (!root) return nullptr;
stack<TreeNode*> stk;
stk.push(root);
// 类似前缀和的概念
int pre = 0;
while (!stk.empty()) {
TreeNode* node = stk.top();
stk.pop();
if (node) {
// 逆中序 倒着 压栈 则为 正中序
if (node->left) stk.push(node->left);
stk.push(node);
stk.push(nullptr);
if (node->right) stk.push(node->right);
}
// 处理部分
else {
node = stk.top();
stk.pop();
node->val += pre;
pre = node->val;
}
}
return root;
}
};