题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。
比如将二元查找树
10
/ \
6 14
/ \ / \
4 8 12 16
转换成双向链表
4=6=8=10=12=14=16。
struct Node
{
int val;
Node *left;
Node *right;
Node(int v)
{
val = v;
left = right = NULL;
}
};
Node* visit(Node *root, bool right)
{
if (root == NULL)
{
return NULL;
}
if (root->left == NULL && root->right == NULL)
{
return root;
}
if (root->left != NULL)
{
Node *pLeft = visit(root->left, false);
pLeft->right = root;
root->left = pLeft;
}
if (root->right != NULL)
{
Node *pRight = visit(root->right, true);
root->right = pRight;
pRight->left = root;
}
Node *result = root;
if (right)
{
while (result->left != NULL)
{
result = result->left;
}
}
else
{
while (result->right != NULL)
{
result = result->right;
}
}
return result;
}
Node* convert(Node *root)
{
Node *result = visit(root, true);
return result;
}