对二叉树进行中序遍历,得到一个排序的序列,然后调整树节点的指针即可得到
版本1 非递归:
TreeNode* Convert(TreeNode* pRootOfTree)
{
if(pRootOfTree==NULL)
return NULL;
stack<TreeNode*> stackTree;
TreeNode* p=pRootOfTree;
TreeNode* pre=NULL;
TreeNode* root=NULL;
int flag=true;
while(p!=NULL || !stackTree.empty()){
while(p!=NULL){
stackTree.push(p);
p=p->left;
}
p=stackTree.top();
stackTree.pop();
if(flag){
root=p;
pre=root;
flag=false;
}else{
pre->right=p;
p->left=pre;
pre=p;
}
p=p->right;
}
return root;
}
版本2 递归版:
1、首先对左子树进行转换,并返回转换后链表的首节点。
2、找出左子树的链表的最后一个节点
3、将根节点加入到左子树链表的尾端
4 、对右子树节点进行转换,返回链表首节点
5、将右子树链表首节点加入做子树尾端
6、根据左子树链表是否为空进行返回。
TreeNode* Convert(TreeNode* pRootOfTree)
{
if(pRootOfTree==NULL)
return NULL;
if(pRootOfTree->left==NULL && pRootOfTree->right==NULL)
return pRootOfTree;
TreeNode* left=Convert(pRootOfTree->left);
TreeNode* p=left;
if(p!=NULL){
while(p->right!=NULL){
p=p->right;
}
p->right=pRootOfTree;
pRootOfTree->left=p;
}
TreeNode* right=Convert(pRootOfTree->right);
if(right!=NULL){
right->left=pRootOfTree;
pRootOfTree->right=right;
}
return left!=NULL ? left:pRootOfTree;
}