【剑指offer】二叉搜索树转双向链表
转载请注明出处: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】二叉搜索树转双向链表的更多相关文章
- 剑指offer 二叉搜索树与双向链表
html, body { font-size: 15px; } body { font-family: Helvetica, "Hiragino Sans GB", 微软雅黑, & ...
- 剑指offer 二叉搜索树和双向链表
剑指offer 牛客网 二叉搜索树和双向链表 # -*- coding: utf-8 -*- """ Created on Tue Apr 9 18:58:36 2019 ...
- 剑指Offer——二叉搜索树与双向链表
题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 分析: 二叉搜索树,中序遍历就是排序的. 所以我们利用中序遍历,将前后两 ...
- 用js刷剑指offer(二叉搜索树与双向链表)
题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 牛客网链接 js代码 /* function TreeNode(x) { ...
- [剑指Offer]36-二叉搜索树与双向链表
链接 https://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5?tpId=13&tqId=11179&tPa ...
- 剑指Offer-26.二叉搜索树与双向链表(C++/Java)
题目: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 分析: 创建两个指针,分别指向要处理的当前元素和当前元素的前一个元素.利用中 ...
- 剑指Offer 二叉搜索树的后序遍历序列
题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 思路: 后续遍历数组的尾部为根节点,前面的部分 ...
- 剑指Offer——二叉搜索树的第k个结点
题目描述: 给定一颗二叉搜索树,请找出其中的第k大的结点. 例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4 分析: 二叉搜索树中序遍历就是从小到大.只 ...
- 剑指Offer——二叉搜索树的后序遍历序列
题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 分析: 二叉查找树(Binary Search ...
- [剑指offer] 二叉搜索树的后序遍历序列 (由1个后续遍历的数组判断它是不是BST)
①题目 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. ②思路 1.后续遍历的数组里,最后一个元素是根. 2 ...
随机推荐
- epoll演示样本
server参考是别人的代码 #include <stdio.h> #include <stdlib.h> #include <errno.h> #include ...
- [WebView其中一项研究]:Web Apps基本介绍
今天,我们开始了解WebView,以及Web Apps发展,从主要内容Android实际的例子来解释正式文件和后续. (博客地址:http://blog.csdn.net/developer_jian ...
- 如何获得SQL Server索引使用情况
原文:如何获得SQL Server索引使用情况 原文出自: http://www.mssqltips.com/sqlservertip/1239/how-to-get-index-usage-info ...
- Android中的应用——谷歌官方Json分析工具Gson使用
一个.Gson基本介绍 Gson(又称Google Gson)是Google公司公布的一个开放源码的Java库.主要用途为串行化Java对象为JSON字符串,或反串行化JSON字符串成Java对象. ...
- SAP ABAP第一,两,三代出口型BADI实现 解释的概念
BADI这是第三代用户出口型.让我们来看看如何实现的细节. 一个,用户出口的类型 1,第一代 sap提供了一个空的子程序代码.在这个过程分,用户可以添加自己的代码.为了控制自己的需求.这样的改进是需要 ...
- Ajax请求访问action推断文件是否存在
action措辞: public ActionForward fileIsExsit(ActionMapping mapping, ActionForm form, HttpServletReques ...
- linux VIM基本命令
linux VIM命令: vim 在命令行中输入vim,进入vim编辑器 Esc 退出i(插入)命令进行其他命令使用 :sh 进入shell命令行,运行完命令后ctrl+d退出又一次进入vim编辑继续 ...
- Gallatin(大陆版)Office365中Exchange Online混合部署功能已经能够使用了
经过測试,Exchange混合部署已经能够使用了 前置条件: 本机至少须要一台Exchange Server 2013作为混合部署server 须要一个公网域名 domian.com,能够和内部域名不 ...
- wikioi 1034 家 实时动态的网络流量(费用流)
因为随着时间的推移.网络侧变得,因此,常见的网络流量也解决不了这个问题,.如果T毕竟运输时间. 为此.我们可以基于时间分割点,所有的点将被分割为T点. 对于每一个点,下一次甚至一个容量为本人INF边缘 ...
- 彩色图像--色彩空间 YIQ 、YUV 、YCbCr 、YC1C2 和I1I2I3
学习DIP文章64天 转载请注明文章出处:http://blog.csdn.net/tonyshengtan .出于尊重文章作者的劳动,转载请标明出处.文章代码已托管,欢迎共同开发:https://g ...