题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。
思路:
- 创建一个节点指针last,指向空;
- 中序遍历整个树,当访问到每个节点时,将当前节点放入last指向的链表的末尾,并调整链表及当前节点的左右指针。
代码:
struct TNode
{
int data;
struct TNode *left;
struct TNode *right;
}TNode;
void covert ( TNode *troot , TNode *last )
{
if( troot==NULL )//跳出递归
return;
if( troot->left!=NULL )//遍历左子树
covert( troot->left , last );
//将当前节点插入到链表的最后
troot->left = last;
if(last!=NULL)
last->right = troot;
last = troot;
if( troot->right!=NULL )//遍历右子树
covert( troot->right , last )
}
TNode* app( TNode *head )
{
TNode *last = NULL;
covert( head , last );
return last;
}