题目
中序遍历 + 栈
class Solution {
public:
TreeNode* convertBST(TreeNode* root) {
stack<TreeNode*> s, tmp;
TreeNode *p = root;
while(p || !tmp.empty()) {
if(p) {
tmp.push(p);
p = p->left;
}
else {
p = tmp.top();
tmp.pop();
s.push(p);
p = p->right;
}
}
int ans = 0;
while(!s.empty()) {
p = s.top();
s.pop();
p->val += ans;
ans = p->val;
}
return root;
}
};
逆中序遍历
上一种方法用到的栈 s 实际上是为了寻找从小到大的结点排列,那么直接用逆中序遍历就不需要构建该序列:
class Solution {
public:
TreeNode* convertBST(TreeNode* root) {
stack<TreeNode*> tmp;
TreeNode *p = root;
int ans = 0;
while(p || !tmp.empty()) {
if(p) {
tmp.push(p);
p = p->right;
}
else {
p = tmp.top();
tmp.pop();
p->val += ans;
ans = p->val;
p = p->left;
}
}
return root;
}
};