题目描述:

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。

输入:

输入可能包含多个测试样例。
对于每个测试案例,输入的第一行为一个数n(0<n<1000),代表测试样例的个数。
接下来的n行,每行为一个二叉搜索树的先序遍历序列,其中左右子树若为空则用0代替。

输出:

对应每个测试案例,
输出将二叉搜索树转换成排序的双向链表后,从链表头至链表尾的遍历结果。

样例输入:
      
样例输出:
  

解题思路:

  这道题应该是最近写的最繁琐的一道题了。

  首先输入按规则来,需要进行前序遍历输入

void createTree(BTree **b){
int m;
scanf("%d",&m);
if(m == )
*b = NULL;
else{
BTree *s = (BTree *)malloc(sizeof(BTree));
s->data = m;
s->lchild = NULL;
s->rchild = NULL;
*b = s;
createTree(&((*b)->lchild));
createTree(&((*b)->rchild));
}
}

  另外,整体的思路,是用一个指针记录转换的双链表表尾。

  每次进行中序遍历的转换。

  最先转换的是最左下的节点,

void converNode(BTree *b,BTree **p){
if(b == NULL)
return ;
BTree *pnow = b;
if(b->lchild != NULL)
converNode(b->lchild,p); pnow->lchild = *p;
if(*p != NULL)
(*p)->rchild = pnow; *p = pnow; if(b->rchild != NULL)
converNode(b->rchild,p);
}

  每次遍历节点的左孩子右孩子。把左孩子指向转换链表的尾节点,并把末尾指针的右孩子指向自己。右孩子指向节点的右孩子。如果没有右孩子就返回。下面是代码思路的步骤:

1 找到最左边也就是最小的节点,PLast = NULL;

2 让节点的左孩子指向链尾,然后链尾指针右移。如果右孩子为空就返回。

最后我们从尾遍历回头指针返回。

全部代码:

#include <stdio.h>
#include <stdlib.h>
typedef struct btree{
int data;
struct btree *lchild,*rchild;
}BTree; void createTree(BTree **b);
void inorderTree(BTree *b);
BTree * convert(BTree *b);
void converNode(BTree *b,BTree **p); int main(){
int n;
scanf("%d",&n);
while(n--){
BTree *b = (BTree *)malloc(sizeof(BTree));
createTree(&b);
BTree *head = convert(b);
while(head!=NULL){
printf("%d ",head->data);
head = head->rchild;
}
printf("\n");
}
return ;
}
BTree* convert(BTree *b){
BTree *pLast = NULL;
converNode(b,&pLast); BTree *phead = pLast;
while(phead != NULL && phead->lchild != NULL)
phead = phead->lchild;
return phead;
}
void converNode(BTree *b,BTree **p){
if(b == NULL)
return ;
BTree *pnow = b;
if(b->lchild != NULL)
converNode(b->lchild,p); pnow->lchild = *p;
if(*p != NULL)
(*p)->rchild = pnow; *p = pnow; if(b->rchild != NULL)
converNode(b->rchild,p);
}
void createTree(BTree **b){
int m;
scanf("%d",&m);
if(m == )
*b = NULL;
else{
BTree *s = (BTree *)malloc(sizeof(BTree));
s->data = m;
s->lchild = NULL;
s->rchild = NULL;
*b = s;
createTree(&((*b)->lchild));
createTree(&((*b)->rchild));
}
}
/**************************************************************
Problem: 1503
User: xhalo
Language: C
Result: Accepted
Time:80 ms
Memory:1704 kb
****************************************************************/

最新文章

  1. strcpy 函数的实现
  2. HNOI2016(BZOJ4542) 大数
  3. poj 1035
  4. Thinkphp3.2中的模板继承
  5. 简单实用的双向电平转换电路(3.3v-5v)
  6. javascript获取url信息的常见方法
  7. Http请求与响应格式
  8. 慕课网-安卓工程师初养成-1-6 MyEclipse的使用简介
  9. C# A窗口内容显示在B窗口中的方法
  10. 村田噪声抑制基础教程-第一章 需要EMI静噪滤波器的原因
  11. C++ 我想这样用(一)
  12. cf B. Color the Fence
  13. hdu 2757 Ocean Currents(优先队列+bfs)
  14. Swift 使用Extension 场景 浅析
  15. Vue模板内容
  16. js数组、内置对象、自定义对象
  17. RecyclerView详解
  18. keras,tensorflow,numpy,jupyter
  19. mysql 设置初始密码
  20. Spark源码剖析 - SparkContext的初始化(四)_Hadoop相关配置及Executor环境变量

热门文章

  1. 【POJ 3784】 Running Median (对顶堆)
  2. 【状压dp】送餐员
  3. 【树形dp】Codeforces Round #405 (rated, Div. 1, based on VK Cup 2017 Round 1) B. Bear and Tree Jumps
  4. python3-开发进阶-RESTful 软件架构风格
  5. Java并发(一):多线程干货总结
  6. JVM堆 栈 方法区详解
  7. JavaScript之String类型
  8. GIT使用(自用)
  9. oracle增加表空间的四种方法
  10. jquer总结