即按照中序遍历满足 升序
知识点
对于中序遍历:1、递归 2、遍历 3、Morris
掌握前两种方法实现 树的遍历;
解题思路
迭代
python实现:
class Solution:
def recoverTree(self, root: TreeNode) -> None:
"""
Do not return anything, modify root in-place instead.
"""
firstNode = None
secondNode = None
pre = TreeNode(float("-inf"))
stack = []
p = root
while p or stack:
while p:
stack.append(p)
p = p.left
p = stack.pop()
if not firstNode and pre.val > p.val:
firstNode = pre
if firstNode and pre.val > p.val:
#print(firstNode.val,pre.val, p.val)
secondNode = p
pre = p
p = p.right
firstNode.val, secondNode.val = secondNode.val, firstNode.val
C++ 实现:
class Solution {
public:
void recoverTree(TreeNode* root) {
// 使用迭代,就是利用栈的思想
TreeNode* first =NULL;
TreeNode* second=NULL;
TreeNode* pre =new TreeNode(-1);// 最小值
stack<TreeNode*> s ={}; // creat a empty stack
TreeNode* p=root;// define a pointer to point the tree root
while(p!=NULL || !s.empty()){
while(p!=NULL){
s.push(p);
p=p->left;
}
p=s.top();// return the ding value
s.pop();// delete it
if(first==NULL and pre->val>p->val){
first=pre;
}
if(first!=NULL and pre->val>p->val){
second=p;
}
pre=p;
p=p->right;
}
first->val=second->val;
first->val,second->val=second->val,first->val;// i dont know what it means
}
};
小结
管它什么真理无穷,进一寸有一寸的欢喜;