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); } };