题目描述:

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

输入:

输入可能包含多个测试样例。
对于每个测试案例,输入的第一行为一个数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
****************************************************************/

剑指OFFER之二叉搜索树与双向链表(九度OJ1503)的更多相关文章

  1. 剑指 Offer 36. 二叉搜索树与双向链表 + 中序遍历 + 二叉排序树

    剑指 Offer 36. 二叉搜索树与双向链表 Offer_36 题目描述 题解分析 本题考查的是二叉树的中序遍历以及二叉排序树的特征(二叉排序树的中序遍历序列是升序序列) 利用排序二叉树中序遍历的性 ...

  2. 剑指 Offer 36. 二叉搜索树与双向链表

    剑指 Offer 36. 二叉搜索树与双向链表 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表.要求不能创建任何新的节点,只能调整树中节点指针的指向. 为了让您更好地理解问题,以下面的 ...

  3. 【剑指Offer】二叉搜索树与双向链表 解题报告(Python)

    [剑指Offer]二叉搜索树与双向链表 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interview ...

  4. 【剑指offer】二叉搜索树转双向链表,C++实现

    原创博文,转载请注明出处! # 题目 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 二叉树节点的定义 struct TreeNod ...

  5. 【Java】 剑指offer(36) 二叉搜索树与双向链表

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不 ...

  6. Go语言实现:【剑指offer】二叉搜索树与双向链表

    该题目来源于牛客网<剑指offer>专题. 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. Go语言实现: type T ...

  7. 剑指offer 27二叉搜索树与双向链表

    class Solution { public: void ConvertNode(TreeNode* pRootOfTree,TreeNode** pre) { if(pRootOfTree) { ...

  8. 【剑指offer】二叉搜索树转双向链表

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/26623795 题目描写叙述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表. ...

  9. 《剑指offer》二叉搜索树和双向链表

    本题来自<剑指offer> 反转链表 题目: 思路: C++ Code: Python Code: 总结:

  10. 剑指Offer 26. 二叉搜索树与双向链表 (二叉搜索树)

    题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 题目地址 https://www.nowcoder.com/practic ...

随机推荐

  1. BZOJ 3437 小P的牧场(斜率优化DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3437 [题目大意] n个牧场排成一行,需要在某些牧场上面建立控制站, 每个牧场上只能建 ...

  2. 【推导】【模拟】AtCoder Regular Contest 082 F - Sandglass

    题意:有个沙漏,一开始bulb A在上,bulb B在下,A内有a数量的沙子,每一秒会向下掉落1.然后在K个时间点ri,会将沙漏倒置.然后又有m个询问,每次给a一个赋值ai,然后询问你在ti时刻,bu ...

  3. 【期望DP+高斯消元】BZOJ3270-博物馆

    [题目大意] 有m条走廊连接的n间房间,并且满足可以从任何一间房间到任何一间别的房间.两个男孩现在分别处在a,b两个房间,每一分钟有Pi 的概率在这分钟内不去其他地方(即呆在房间不动),有1-Pi 的 ...

  4. [NOIp2017提高组]逛公园

    题目大意: 给你一个有向图,若用dis(u,v)表示从u到v的最短路长度,求从1到n的长度不超过dis(1,n)+k的路径数. 思路: 首先分别预处理出以1,n为起点的单.源最短路. 对于合法的边重构 ...

  5. 计算gcd Exercise07_14

    import java.util.Scanner; /** * @author 冰樱梦 * 时间:2018年下半年 * 题目:计算gcd * */ public class Exercise07_14 ...

  6. centos svnversion安装部署

    第一步: yum install subversion; 第二步: mkdir /data/svn/conf mkdir /data/svn/library 第三步: svnadmin create  ...

  7. [转]iBatis简单入门教程

    iBatis 简介: iBatis 是apache 的一个开源项目,一个O/R Mapping 解决方案,iBatis 最大的特点就是小巧,上手很快.如果不需要太多复杂的功能,iBatis 是能够满足 ...

  8. CentOS更新Python版本,同时修复yum不能使用的问题

    转自:Li_Hanx博客 遇到问题,需要更新python,网上找了好多都不能顺利更新,找到这位大佬的这篇博客,写的非常好,分享给大家. 发现一个新办法,那就是直接安装另一个版本的Python,比如Py ...

  9. 判断 Selite中标存在或者字段存在的方法

    判断表存在的方法很简单,网上很多: SELECT COUNT(*) FROM sqlite_master where type='table' and name='%s'" % tname; ...

  10. Linux上安装使用SSH(ubuntu&&redhat)

    转自:http://blog.csdn.net/zxs9999/article/details/6930736 Ubuntu安装使用SSH ubuntu默认并没有安装ssh服务,如果通过ssh链接ub ...