题目:输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的节点,只能调整树中节点的指向。
分析:由于要求转换之后的链表是排好序的,我们采用中序遍历,遍历树中的每一个节点。根节点、左子树和右子树。在把左、右子树都转换成双向链表之后再和根节点连接起来,整颗二叉树就转换成了排序好的双向链表。
实现如下:
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
//每次遇到一个节点就会接入双向链表,所以要更新双向链表最后一个节点的值,因此,这里参数用TreeNode**
void ConvertNode(TreeNode*pnode,TreeNode**plastnodeinlist)
{
if(pnode==NULL)
return;
if(pnode->left)
ConvertNode(pnode->left,plastnodeinlist);
pnode->left=*plastnodeinlist; //每次遇到一个节点就接入双向链表中
if(*plastnodeinlist)
(*plastnodeinlist)->right=pnode;
*plastnodeinlist=pnode;
if(pnode->right)
ConvertNode(pnode->right,plastnodeinlist);
}
TreeNode* Convert(TreeNode*root)
{
TreeNode*plastnodeinlist=NULL; //指向双向链表最后一个节点
ConvertNode(root,&plastnodeinlist);
TreeNode* pheadoflist=plastnodeinlist;
while(pheadoflist!=NULL&&pheadoflist->left!=NULL)
pheadoflist=pheadoflist->left;
return pheadoflist;
}