题面:《剑指Offer》P151 / 牛客网
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
如
如果不考虑箭头,可以看到4 6 8 10 12 14 16是树的中序遍历
因此可以借用中序遍历的方法进行修改
/*
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)
return NULL;
stack<TreeNode*> s;
TreeNode *node = pRootOfTree,*pre=NULL,*res;
while (node || !s.empty())
{
while (node)
{
s.push(node);
node = node->left;
}
node = s.top();
s.pop();
if (!pre)
res = pre = node;
else
{
pre->right = node;
node->left = pre;
pre = node;
}
node = node->right;
}
return res;
}
};
递归
class Solution
{
public:
TreeNode *leftHead=NULL, *rightHead = NULL;
TreeNode* Convert(TreeNode* pRootOfTree)
{
if (!pRootOfTree)
return NULL;
Convert(pRootOfTree->left);
if (!rightHead)
leftHead = rightHead = pRootOfTree;
else
{
rightHead->right = pRootOfTree;
pRootOfTree->left = rightHead;
rightHead = pRootOfTree;
}
Convert(pRootOfTree->right);
return leftHead;
}
};