Given a binary tree, return the inorder traversal of its nodes' values.
For example:
Given binary tree {1,#,2,3}
,
1 \ 2 / 3
return [1,3,2]
.
记录前一个节点的方法是可以设一个TreeNode*的引用,不断地通过中序遍历更新这个引用。
此外,建一个有两个位置的vector记录一下出错的那两个节点,swap一下就好。
class Solution {
public:
void recoverTree(TreeNode *root) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
vector<TreeNode*> res(2);
TreeNode* pre = NULL;
inorderTrasverse(root,pre,res);
swap(res[0]->val,res[1]->val);
}
void inorderTrasverse(TreeNode *root, TreeNode* &pre, vector<TreeNode*> &res)
{
if(root->left) inorderTrasverse(root->left,pre,res);
if(pre!=NULL)
{
if(pre->val>root->val)
{
if(res[0]==NULL)
{
res[0] = pre; // 第一个比后面的数大的那个数肯定是有问题的
res[1] = root; // 第一个比前面的数小的那个数可能是有问题的
}
else
{
res[1] = root; //最后一个比前面的数小的数肯定是有问题的
}
}
}
pre = root;
if(root->right) inorderTrasverse(root->right,pre,res);
}
};