方法一:递归
思路:
1.核心是中序遍历的递归算法。
2.修改当前遍历节点与前一遍历节点的指针指向。
class Solution {
public:
TreeNode* tmp = NULL;
TreeNode* res = NULL;
TreeNode* Convert(TreeNode* pRootOfTree)
{
ConvertSub(pRootOfTree);
return res;
}
void ConvertSub(TreeNode* pRootOfTree){
if(pRootOfTree==NULL) return;
ConvertSub(pRootOfTree->left);
if(tmp==NULL){
tmp = pRootOfTree;
res = pRootOfTree;
}else{
tmp->right = pRootOfTree;
pRootOfTree->left = tmp;
tmp = pRootOfTree;
}
ConvertSub(pRootOfTree->right);
}
};
方法二:非递归
思路:
主要思路和方法一差不多,主要不同的是方法一用递归的方式求得中序遍历,而方法二用的是非递归的方式。
class Solution {
public:
TreeNode* Convert(TreeNode* pRootOfTree)
{
if(pRootOfTree==NULL) return NULL;
stack<TreeNode*> st;
TreeNode* tmp = NULL;
TreeNode* res = NULL;
while(pRootOfTree!=NULL || !st.empty()){
while(pRootOfTree!=NULL){
st.push(pRootOfTree);
pRootOfTree = pRootOfTree->left;
}
pRootOfTree = st.top();
st.pop();
if(tmp==NULL){
tmp = pRootOfTree;
res = pRootOfTree;
}else{
tmp->right = pRootOfTree;
pRootOfTree->left = tmp;
tmp = pRootOfTree;
}
pRootOfTree = pRootOfTree->right;
}
return res;
}
};