题目要求:将二叉查找树转换成排序的双向链表,不能创建新节点,只调整指针。
查找树的结点定义如下:
-
class Node
-
{
-
public:
-
Node(int x):left(NULL),right(NULL),data(x){};
-
Node * left;
-
Node * right;
-
int data;
-
};
既然是树,其定义本身就是递归的,自然用递归算法处理就很容易。
将根结点的左子树和右子树转换为有序的双向链表,然后根节点的left指针指向左子树结果的最后一个结点,同时左子树最后一个结点的right指针指向根节点;根节点的right指针指向右子树结果的第一个结点,同时右子树第一个结点的left指针指向根节点。
-
-
-
-
-
-
void Convert(Node * r,Node * & first,Node * & last)
-
{
-
-
Node *firstL,*lastL,*firstR,*lastR;
-
if(r==NULL) return;
-
Convert(r->left,firstL,lastL);
-
Convert(r->right,firstR,lastR);
-
-
if(r->left==NULL)
-
{
-
-
-
first=r;
-
r->left=NULL;
-
}
-
else
-
{
-
-
-
first=firstL;
-
-
-
r->left=lastL;
-
lastL->right=r;
-
}
-
if(r->right==NULL)
-
{
-
-
-
last=r;
-
r->right=NULL;
-
}
-
else
-
{
-
-
-
last=lastR;
-
-
-
r->right=firstR;
-
firstR->left=r;
-
}
-
}
阅读(1750) | 评论(0) | 转发(0) |