博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
剑指OFFER之二叉搜索树与双向链表(九度OJ1503)
阅读量:6083 次
发布时间:2019-06-20

本文共 2759 字,大约阅读时间需要 9 分钟。

hot3.png

题目描述:

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

 

输入:

输入可能包含多个测试样例。

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

 

输出:

对应每个测试案例,

输出将二叉搜索树转换成排序的双向链表后,从链表头至链表尾的遍历结果。

 

样例输入:
12 1 0 0 3 0 0

 

样例输出:
1 2 3

解题思路:

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

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

void createTree(BTree **b){      int m;    scanf("%d",&m);    if(m == 0)        *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 
#include
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 0;}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 == 0) *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****************************************************************/

 

转载于:https://my.oschina.net/u/204616/blog/544960

你可能感兴趣的文章
使用scikit-learn解决文本多分类问题(附python演练)
查看>>
2018 年最值得关注的 JavaScript 趋势
查看>>
什么是区块链?超级账本 Brian Behlendorf 从五个方面教你认识
查看>>
Linux中的帮助功能
查看>>
针对Android的Pegasus恶意软件版本和针对iOS的有什么不同?
查看>>
全局探色器
查看>>
Hive Export和Import介绍及操作示例
查看>>
http://mongoexplorer.com/ 一个不错的 mongodb 客户端工具。。。
查看>>
Xcode 4.3 使用xcodebuild命令编译项目环境设置
查看>>
上传jar包到nexus私服
查看>>
Android LruCache 二级缓存
查看>>
Java使用Redis
查看>>
Why Namespace? - 每天5分钟玩转 OpenStack(102)
查看>>
Nuget帮助说明
查看>>
基于linux的ekho(余音)安装与开发
查看>>
Java基础---Java中无参数带返回值方法的使用(三十七)
查看>>
MySQL性能优化的最佳20+条经验(1)
查看>>
对Ansible二次开发来检查服务器的Java程序占用端口数量
查看>>
使用Logstash收集PHP相关日志
查看>>
a:link,a:visited,a:hover,a:active 分别是什么意思?
查看>>