解题思路
递归解法,中序遍历+前驱节点
注意前驱节点是引用!
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
TreeNode* Convert(TreeNode* pRootOfTree) {
if(pRootOfTree==nullptr)
return nullptr;
TreeNode*pre=nullptr;
help(pRootOfTree,pre);
while(pRootOfTree->left)
pRootOfTree=pRootOfTree->left;
return pRootOfTree;
}
void help(TreeNode* cur,TreeNode* &pre){
if(cur==nullptr)
return;
help(cur->left,pre);
cur->left=pre; //找到前驱节点
if(pre)pre->right=cur; //假如存在左节点,右旋转
pre=cur; //更新前驱节点为根节点,递归
help(cur->right,pre);
}
};