即按照中序遍歷滿足 升序
知識點
對於中序遍歷: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
}
};
小結
管它什麼真理無窮,進一寸有一寸的歡喜;