二叉搜索树中序遍历即是升序,所以我们使用队列,中序遍历把结点存入队列中,再出队,把结点链接起来即可
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*
* C语言声明定义全局变量请加上static,防止重复定义
*/
/**
*
* @param pRootOfTree TreeNode类
* @return TreeNode类
*/
//中序遍历
void LDR(struct TreeNode* T, struct TreeNode* queue[1001],int* tail){
if(T==NULL){
return;
}
LDR(T->left,queue,tail);
queue[(*tail)++]=T; //中序遍历,将结点指针放入队中
LDR(T->right,queue,tail);
}
struct TreeNode* Convert(struct TreeNode* pRootOfTree ) {
// write code here
if(pRootOfTree==NULL){
return NULL;
}
int queue_head=0;
int queue_tail=0;
struct TreeNode* queue[1001];//使用数组实现队列功能,数组中存放的是结点指针
LDR(pRootOfTree,queue,&queue_tail);//中序遍历,把所有结点入队
queue[queue_tail]=NULL;//二叉树所有结点入队后,把最后一个结点之后一个队列位置赋NULL值,因为初始化是随机值,
//而链表最后一个结点下一个指针要指向NULL才行
//初始化需要的前结点,当前节点,下一个结点
struct TreeNode* pre=NULL;
struct TreeNode* cur=queue[queue_head++]; //出队第一个
struct TreeNode* list_head=cur;//函数需要返回值,我们就返回队列第一个结点,即中序遍历第一个结点即可
struct TreeNode* next=queue[queue_head];
//将结点之间连接起来,构成链表
while(queue_head<=queue_tail){
cur->left=pre;
cur->right=next;
pre=cur;
cur=next;
queue_head++;//队头向后移动
next=queue[queue_head];//出队下一个
}
return list_head;
}