给出一棵BST,将其转换为双向链表,left保存前节点,right保存后节点。
例如:
4
/ \
1 7
/ \ / \
0 2 5 8
\ \ \
3 6 9
变为:0<->1<->2<->3<->4<->5<->6<->7<->8<->9.
思路:在visit函数中返回该节点的最左叶子节点,最右叶子结点。
struct Node
{
int val;
Node *left;
Node *right;
Node(int v) : val(v), left(NULL), right(NULL){}
};
void visit(Node *root, Node **left, Node **right)
{
if (root == NULL)
{
*left = NULL;
*right = NULL;
return;
}
if (root->left)
{
Node *p = NULL;
Node *q = NULL;
visit(root->left, &p, &q);
root->left = q;
q->right = root;
*left = p;
}
else
{
*left = root;
}
if (root->right)
{
Node *p = NULL;
Node *q = NULL;
visit(root->right, &p, &q);
root->right = p;
p->left = root;
*right = q;
}
else
{
*right = root;
}
}
Node* fun(Node *root)
{
if (root == NULL)
{
return NULL;
}
Node *left = NULL;
Node *right = NULL;
visit(root, &left, &right);
return left;
}