538. 把二叉搜索树转换为累加树
问题描述:传送门
思路:
首先要了解累加树的概念,我们先从数组的角度去看一个有序数组【2,5,13】,如果转换成累加树就是【20,18,13】,即从后向前累加的结果。
再从二叉树的角度去看,累加顺序就是右、中、左。
所以,我们需要反中序遍历这棵二叉树,然后再依次累加。
1、递归
本题需要一个pre指针记录当前遍历节点cur的前一个节点,方便累加。
① 确定递归函数的参数和返回值
参数:pre、节点cur
返回值:不需要返回值,因为要遍历整棵树,不需要返回特定某个节点。
int pre; // 记录前一个节点的数值
void traversal(TreeNode* cur)
② 确定终止条件
遇到空节点就终止
if (cur == NULL) return;
③ 确定单层递归的逻辑
因为是右中左遍历二叉树,中间节点的处理逻辑是让cur的数值加上前一个节点的数值。
traversal(cur->right); // 右
cur->val += pre; // 中
pre = cur->val;
traversal(cur->left); // 左
完整代码如下:
class Solution {
private:
int pre; // 记录前一个节点的数值
void traversal(TreeNode* cur) { // 右中左遍历
if (cur == NULL) return;
traversal(cur->right);
cur->val += pre;
pre = cur->val;
traversal(cur->left);
}
public:
TreeNode* convertBST(TreeNode* root) {
pre = 0;
traversal(root);
return root;
}
};
2、迭代
模板题。
代码如下:
class Solution {
private:
int pre; // 记录前一个节点的数值
void traversal(TreeNode* root) {
stack<TreeNode*> st;
TreeNode* cur = root;
while (cur != NULL || !st.empty()) {
if (cur != NULL) {
st.push(cur);
cur = cur->right; // 右
} else {
cur = st.top(); // 中
st.pop();
cur->val += pre;
pre = cur->val;
cur = cur->left; // 左
}
}
}
public:
TreeNode* convertBST(TreeNode* root) {
pre = 0;
traversal(root);
return root;
}
};