转载请注明出处:http://blog.csdn.net/ns_code/article/details/26623795

题目描写叙述:

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

输入:

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

输出:

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

例子输入:
1
2 1 0 0 3 0 0
例子输出:
1 2 3

思路:这道题目关键在于不能创建新的节点,如不然,我们能够直接将二叉排序树中序遍历保存到一个数组中,而后再建立一个双性链表,将数据保存到双向链表里。

这里不能创建新节点,我们仅仅能改变节点的指向左右子树的节点,让其变为指向二叉链表中的前后节点,非常明显这里相同用的是中序遍历,因此这道题目依旧是中序遍历的变种,中序递归构造实现就可以,每次递归都保存一个指向已构造好的双向链表的尾节点的指针,将其与下一个节点连接起来。

另外,这道题OJ的输出格式与前面的不同,输出例子中又没有说明,我试了三次才AC,前两次都是报PE,双向链表的最后一个元素的输出后面一样,要有个空格才行。

AC代码:

#include<stdio.h>
#include<stdlib.h> typedef struct BSTNode
{
int data;
struct BSTNode *left;
struct BSTNode *right;
}BSTNode,*BSTree; /*
依据题目要求的格式创建二叉排序树
*/
void CreateBST(BSTree *pRoot)
{
int data;
scanf("%d",&data);
if(data == 0)
pRoot = NULL;
else
{
*pRoot = (BSTree)malloc(sizeof(BSTNode));
if(*pRoot == NULL)
exit(EXIT_FAILURE);
(*pRoot)->data = data;
(*pRoot)->left = NULL;
(*pRoot)->right = NULL;
CreateBST(&((*pRoot)->left));
CreateBST(&((*pRoot)->right));
}
} /*
採用中序遍历的方式将二叉树转化为双向链表,
*pLas指向双向链表的最后一个节点
*/
void ConvertNode(BSTree pRoot,BSTree *pLast)
{
if(pRoot == NULL)
return; //先转化左子树
if(pRoot->left != NULL)
ConvertNode(pRoot->left,pLast); //将双向链表的最后一个节点与根节点连接在一起
pRoot->left = *pLast;
if(*pLast != NULL)
(*pLast)->right = pRoot;
*pLast = pRoot; //转换右子树
if(pRoot->right != NULL)
ConvertNode(pRoot->right,pLast);
} /*
返回双向链表的头结点
*/
BSTree Convert(BSTree pRoot)
{
if(pRoot == NULL)
return NULL;
if(pRoot->left==NULL && pRoot->right==NULL)
return pRoot; BSTree pLast = NULL;
ConvertNode(pRoot,&pLast); //返回头结点
BSTree pHead = pLast;
while(pHead->left != NULL)
pHead = pHead->left; return pHead;
} int main()
{
int n;
while(scanf("%d",&n) != EOF)
{
int i;
for(i=0;i<n;i++)
{
BSTree pRoot = NULL;
CreateBST(&pRoot);
BSTree pHead = Convert(pRoot);
while(pHead != NULL)
{
printf("%d ",pHead->data);
pHead = pHead->right;
} printf("\n");
free(pRoot);
pRoot = NULL;
}
}
return 0;
}
/**************************************************************
    Problem: 1503
    User: mmc_maodun
    Language: C
    Result: Accepted
    Time:70 ms
    Memory:1704 kb
****************************************************************/


【剑指offer】二叉搜索树转双向链表的更多相关文章

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

    html, body { font-size: 15px; } body { font-family: Helvetica, "Hiragino Sans GB", 微软雅黑, & ...

  2. 剑指offer 二叉搜索树和双向链表

    剑指offer 牛客网 二叉搜索树和双向链表 # -*- coding: utf-8 -*- """ Created on Tue Apr 9 18:58:36 2019 ...

  3. 剑指Offer——二叉搜索树与双向链表

    题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 分析: 二叉搜索树,中序遍历就是排序的. 所以我们利用中序遍历,将前后两 ...

  4. 用js刷剑指offer(二叉搜索树与双向链表)

    题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 牛客网链接 js代码 /* function TreeNode(x) { ...

  5. [剑指Offer]36-二叉搜索树与双向链表

    链接 https://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5?tpId=13&tqId=11179&tPa ...

  6. 剑指Offer-26.二叉搜索树与双向链表(C++/Java)

    题目: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 分析: 创建两个指针,分别指向要处理的当前元素和当前元素的前一个元素.利用中 ...

  7. 剑指Offer 二叉搜索树的后序遍历序列

    题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同.   思路: 后续遍历数组的尾部为根节点,前面的部分 ...

  8. 剑指Offer——二叉搜索树的第k个结点

    题目描述: 给定一颗二叉搜索树,请找出其中的第k大的结点. 例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4 分析: 二叉搜索树中序遍历就是从小到大.只 ...

  9. 剑指Offer——二叉搜索树的后序遍历序列

    题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 分析: 二叉查找树(Binary Search ...

  10. [剑指offer] 二叉搜索树的后序遍历序列 (由1个后续遍历的数组判断它是不是BST)

    ①题目 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. ②思路 1.后续遍历的数组里,最后一个元素是根. 2 ...

随机推荐

  1. hdu 3076 ssworld VS DDD (概率dp)

    ///题意: /// A,B掷骰子,对于每一次点数大者胜,平为和,A先胜了m次A赢,B先胜了n次B赢. ///p1表示a赢,p2表示b赢,p=1-p1-p2表示平局 ///a赢得概率 比一次p1 两次 ...

  2. 它们的定义TextView使之具有跑马灯的效果

    一.引入问题 使用通用textview快乐效应,焦点事件不启动滚动,button目前的焦点事件,但丑,因此,需要定制TextView 天生焦点 个textview FocusedTextView.ja ...

  3. Android学习小Demo(20)关于Fragment的应用

    Android在3.0之后引入了Fragment的概念,我推測其想法可能仅仅是想更好地兼容大屏幕或者平板的开发,由于大屏幕能够展示很多其它的内容,而内容一多,逻辑有可能就乱,而利用Fragment,则 ...

  4. C#使用ServiceController控制windows服务

    C#在,使用ServiceController控制类windows服务,添加首次使用前引文:System.ServiceProcess,空间中引用:using System.ServiceProces ...

  5. Intent常用使用汇总

    方法一:调用默认的短信程序Intent intent = new Intent(Intent.ACTION_VIEW);intent.setType("vnd.android-dir/mms ...

  6. 减小Cookie体积

    HTTP coockie能够用于权限验证和个性化身份等多种用途.coockie内的有关信息是通过HTTP文件头来在webserver和浏览器之间进行交流的.因此保持coockie尽可能的小以降低用户的 ...

  7. Android Bitmap OutOfMemory 解决的方法

    在Android应用里,最耗费内存的就是图片资源.并且在Android系统中.读取位图Bitmap时,分给虚拟机中的图片的堆栈大小仅仅有8M.假设超出了.就会出现OutOfMemory异常 E/And ...

  8. word插入图片显示不完整的解决的方法

    有时在编写word文档,插入图片时,会出现图不完整的情况. 解决方法是:选中图片,段落格式设置为单位行距(不是22磅),图片格式为嵌入式.问题解决.

  9. JQuery插件开发初探——结构熟悉

    工作之余,对Jquery插件做了一点尝试,想着之前总用别人写的插件,自己要是也写一个用岂不是很cool.于是说干就干,动手开始写. 首先是模仿,从一个简单的功能进行入手,了解一下插件开发的流程和结构. ...

  10. POJ 1743 Musical Theme Hash+二分法

    标题效果:有一个美丽的旋律,它们是由一些不大于88音调.如果计为五个音调的量度,问:是否有相同的节奏的多个部分(相同的差,以及两者之间的相同的节奏不能重叠),并寻求最长长度. 思考:这个问题是八人中的 ...