把BST轉換為雙向連結串列

brucehb發表於2017-02-28

給出一棵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;
}


相關文章