剑指OFFER之二叉搜索树与双向链表(九度OJ1503)
题目描述:
-
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
- 输入:
-
输入可能包含多个测试样例。
对于每个测试案例,输入的第一行为一个数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)的更多相关文章
- 剑指 Offer 36. 二叉搜索树与双向链表 + 中序遍历 + 二叉排序树
剑指 Offer 36. 二叉搜索树与双向链表 Offer_36 题目描述 题解分析 本题考查的是二叉树的中序遍历以及二叉排序树的特征(二叉排序树的中序遍历序列是升序序列) 利用排序二叉树中序遍历的性 ...
- 剑指 Offer 36. 二叉搜索树与双向链表
剑指 Offer 36. 二叉搜索树与双向链表 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表.要求不能创建任何新的节点,只能调整树中节点指针的指向. 为了让您更好地理解问题,以下面的 ...
- 【剑指Offer】二叉搜索树与双向链表 解题报告(Python)
[剑指Offer]二叉搜索树与双向链表 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interview ...
- 【剑指offer】二叉搜索树转双向链表,C++实现
原创博文,转载请注明出处! # 题目 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 二叉树节点的定义 struct TreeNod ...
- 【Java】 剑指offer(36) 二叉搜索树与双向链表
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不 ...
- Go语言实现:【剑指offer】二叉搜索树与双向链表
该题目来源于牛客网<剑指offer>专题. 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. Go语言实现: type T ...
- 剑指offer 27二叉搜索树与双向链表
class Solution { public: void ConvertNode(TreeNode* pRootOfTree,TreeNode** pre) { if(pRootOfTree) { ...
- 【剑指offer】二叉搜索树转双向链表
转载请注明出处:http://blog.csdn.net/ns_code/article/details/26623795 题目描写叙述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表. ...
- 《剑指offer》二叉搜索树和双向链表
本题来自<剑指offer> 反转链表 题目: 思路: C++ Code: Python Code: 总结:
- 剑指Offer 26. 二叉搜索树与双向链表 (二叉搜索树)
题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 题目地址 https://www.nowcoder.com/practic ...
随机推荐
- Why Did the Cow Cross the Road III(树状数组)
Why Did the Cow Cross the Road III 时间限制: 1 Sec 内存限制: 128 MB提交: 65 解决: 28[提交][状态][讨论版] 题目描述 The lay ...
- Flask实战第43天:把图片验证码和短信验证码保存到memcached中
前面我们已经获取到图片验证码和短信验证码,但是我们还没有把它们保存起来.同样的,我们和之前的邮箱验证码一样,保存到memcached中 编辑commom.vews.py .. from utils i ...
- 自定义word快捷键,设置插入图片快捷键
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha 自定义word快捷键,设置插入图片快捷键 文件→选项→自定义功能区 选择键盘快捷方式 自 ...
- AGC 022 B - GCD Sequence
题面在这里! 锻炼脑子的小构造题... 一开始被 a[]<=30000 且 序列 gcd = 1所困扰,但是发现这并没有什么,因为我接下来发现了一种总是能构造出 序列和是6的倍数的方案. 首先如 ...
- BZOJ 1711:[Usaco2007 Open]Dining吃饭(最大流)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1711 [题目大意] 每头牛都有一些喜欢的饮料和食物, 现在有一些食物和饮料,但是每样只 ...
- CentOS中如何安装7ZIP
7-zip以高压缩率著称,并且是一款免费开源的压缩软件.在常规的Linux发行版中,无法通过简单的yum命令来安装该软件.那么在CentOS中,如何安装7ZIP呢?有以下3种方法: 第一种,源码编译安 ...
- OpenVPN官方资源下载和官方教程入口
官方资源: https://openvpn.net/index.php/open-source/downloads.html 2.4.4版本下载:(链接: https://pan.baidu.com/ ...
- Git系列六之标签管理
1.Git标签管理 当版本仓库内的数据有个大的改善或者功能更新,我们经常会打一个类似于软件版本号的标签,这样通过标签就可以将版本库中的某个历史版本给记录下来,方便我们随时将特定历史时期的数据取出来用, ...
- Add Two Numbers(from leetcode python 链表)
给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例: 输入:(2 -& ...
- "com.android.ide.s.ProcessException:Process 'cand 'C:\Program Files\Java\jdk1.8.0_60\bin\java.exe'' finished with non-zero exit value 2"
使用Android Studio 出现该问题: "com.android.ide.common.process.ProcessException: org.gradle.process.in ...