题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
时间限制:1秒 空间限制:32768K 热度指数:193676
思路
中序遍历
迭代版
- 建立一个栈,先访问树的左子树,依次入栈,一直到最左的节点
- 若节点不存在,则退栈,并访问(即更改链接关系)
- 令节点等于其右子树
- 重复123,至栈空
/*
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* pRoot)
{
stack<TreeNode*> b;
if(pRoot==NULL)
return pRoot;
TreeNode* pre=NULL;
TreeNode* p;
while(pRoot!=NULL||!b.empty())
{
if(pRoot)
{
b.push(pRoot);
pRoot=pRoot->left;
}
else
{
pRoot=b.top();
b.pop();
if(pre==NULL)
{
p=pRoot;
pRoot->left=pre;
pre=pRoot;
}
else
{
pre->right=pRoot;
pRoot->left=pre;
pre=pRoot;
}
pRoot=pRoot->right;
}
}
return p;
}
};
递归版:
/*
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* pRoot)
{
if(pRoot==NULL||(pRoot->left==NULL&&pRoot->right==NULL)) //空结点,或者叶子结点
return pRoot;
TreeNode* l= Convert(pRoot->left);
TreeNode* p=l;
if(p)//当左子树存在
{
while(p->right)//一直到左子树最右结点
p=p->right;
p->right=pRoot;
pRoot->left=p;
}
TreeNode* r=Convert(pRoot->right);
if(r)//当右子树存在
{
r->left=pRoot;
pRoot->right=r;
}
if(l)//当左子树存在返回左子树头结点,否则返回中间结点
return l;
else
return pRoot;
}
};