二叉搜索树与双向链表
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
代码(中序遍历)
递归
class Solution {
public:
TreeNode* Convert(TreeNode* pRootOfTree)
{
if(!pRootOfTree)
return NULL;
TreeNode *p;
p=CV(pRootOfTree);
while(p->left){
p=p->left;
}
return p;
}
TreeNode* CV(TreeNode* pRootOfTree){
if(!pRootOfTree)
return NULL;
TreeNode *p,*q;
p=CV(pRootOfTree->left);
if(p){
while(p->right)
p=p->right;//找到链表表尾
p->right=pRootOfTree;
pRootOfTree->left=p;
}
q=CV(pRootOfTree->right);
if(q){
while(q->left)
q=q->left;//找到链表表头
pRootOfTree->right=q;
q->left=pRootOfTree;
}
return pRootOfTree;
}
};
非递归
class Solution {
public:
TreeNode* Convert(TreeNode* pRootOfTree)
{
if(!pRootOfTree)
return NULL;
TreeNode *p=pRootOfTree,*pre=pRootOfTree;
stack<TreeNode*> S;
while(pre->left)
pre=pre->left;
while(!S.empty()||p){
if(p){
S.push(p);
p=p->left;
}
else{
p=S.top();
S.pop();
if(pre!=p){
pre->right=p;
p->left=pre;
pre=p;
}
p=p->right;
}
}
while(pRootOfTree->left)
pRootOfTree=pRootOfTree->left;
return pRootOfTree;
}
};