博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二叉搜索树与双向链表
阅读量:7251 次
发布时间:2019-06-29

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

题目描述

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
1 /* 2 struct TreeNode { 3     int val; 4     struct TreeNode *left; 5     struct TreeNode *right; 6     TreeNode(int x) : 7             val(x), left(NULL), right(NULL) { 8     } 9 };*/10 class Solution {11 public:12     TreeNode* Convert(TreeNode* pRootOfTree)13     {14         if(pRootOfTree==NULL) return NULL;15         TreeNode* head=pRootOfTree;16         TreeNode* tail=NULL;17         converttree(head,&tail);18         while(head->left!=NULL)19             head=head->left;20         return head;21         22     }23 private:24     void converttree(TreeNode* root,TreeNode** tail){25         if(root==NULL)26             return;27         TreeNode* tmp=root;28         if(root->left!=NULL){29             converttree(root->left,tail);30         }31         root->left=*tail;32         if((*tail)!=NULL)33             (*tail)->right=tmp;34         *tail=tmp;35         if(tmp->right!=NULL)36             converttree(tmp->right,tail);37     }38 };

转自:

题目描述:

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

 

输入:

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

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

 

输出:

对应每个测试案例,

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

 

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

 

样例输出:
1 2 3
1 void createTree(BTree **b){   2     int m; 3     scanf("%d",&m); 4     if(m == 0) 5         *b = NULL; 6     else{ 7         BTree *s = (BTree *)malloc(sizeof(BTree)); 8         s->data = m; 9         s->lchild = NULL;10         s->rchild = NULL;11         *b = s;12         createTree(&((*b)->lchild));13         createTree(&((*b)->rchild));14     }15 }

另外,整体的思路,是用一个指针记录转换的双链表表尾。

  每次进行中序遍历的转换。

  最先转换的是最左下的节点,

1 void converNode(BTree *b,BTree **p){ 2     if(b == NULL) 3         return ; 4     BTree *pnow = b; 5     if(b->lchild != NULL) 6         converNode(b->lchild,p); 7      8     pnow->lchild = *p; 9     if(*p != NULL)10         (*p)->rchild = pnow;11 12     *p = pnow;13 14     if(b->rchild != NULL)15         converNode(b->rchild,p);16 }

每次遍历节点的左孩子右孩子。把左孩子指向转换链表的尾节点,并把末尾指针的右孩子指向自己。右孩子指向节点的右孩子。如果没有右孩子就返回。下面是代码思路的步骤:

1 找到最左边也就是最小的节点,PLast = NULL;

 

2 让节点的左孩子指向链尾,然后链尾指针右移。如果右孩子为空就返回。

 

最后我们从尾遍历回头指针返回。

全部代码:

1 #include 
2 #include
3 typedef struct btree{ 4 int data; 5 struct btree *lchild,*rchild; 6 }BTree; 7 8 void createTree(BTree **b); 9 void inorderTree(BTree *b);10 BTree * convert(BTree *b);11 void converNode(BTree *b,BTree **p);12 13 int main(){14 int n;15 scanf("%d",&n);16 while(n--){17 BTree *b = (BTree *)malloc(sizeof(BTree)); 18 createTree(&b);19 BTree *head = convert(b);20 while(head!=NULL){21 printf("%d ",head->data);22 head = head->rchild;23 }24 printf("\n");25 }26 return 0;27 }28 BTree* convert(BTree *b){29 BTree *pLast = NULL;30 converNode(b,&pLast);31 32 BTree *phead = pLast;33 while(phead != NULL && phead->lchild != NULL)34 phead = phead->lchild;35 return phead;36 }37 void converNode(BTree *b,BTree **p){38 if(b == NULL)39 return ;40 BTree *pnow = b;41 if(b->lchild != NULL)42 converNode(b->lchild,p);43 44 pnow->lchild = *p;45 if(*p != NULL)46 (*p)->rchild = pnow;47 48 *p = pnow;49 50 if(b->rchild != NULL)51 converNode(b->rchild,p);52 }53 void createTree(BTree **b){ 54 int m;55 scanf("%d",&m);56 if(m == 0)57 *b = NULL;58 else{59 BTree *s = (BTree *)malloc(sizeof(BTree));60 s->data = m;61 s->lchild = NULL;62 s->rchild = NULL;63 *b = s;64 createTree(&((*b)->lchild));65 createTree(&((*b)->rchild));66 }67 }68 /**************************************************************69 Problem: 150370 User: xhalo71 Language: C72 Result: Accepted73 Time:80 ms74 Memory:1704 kb75 ****************************************************************/

 

解题思路:

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

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

转载地址:http://nnhbm.baihongyu.com/

你可能感兴趣的文章
配置云存储网关在线服务支持多个互联VPC-高速通道版
查看>>
6个步骤从头开始编写机器学习算法:感知器案例研究
查看>>
NCalc 学习笔记 (三)
查看>>
NetBeans 成为 Apache 软件基金会顶级项目
查看>>
SSRF在Redis中反弹shell
查看>>
UML关系图
查看>>
SpringBoot 手写切片/面向切面编程
查看>>
动态 Web Server 技术发展历程
查看>>
使用pymysql(使用一)
查看>>
Redisson 3.10.6 发布,Redis 客户端
查看>>
日志框架 - 基于spring-boot - 使用入门
查看>>
用libtommath实现RSA算法
查看>>
基于POLARDB数据库的压测实践
查看>>
通过工具SecureCRTPortable将项目部署到服务器上
查看>>
利用QRCode实现待logo的二维码的创建
查看>>
【云周刊】第190期:阿里云超算揭秘:虚拟机的心脏,物理机的肌肉
查看>>
崩溃bug日志总结3
查看>>
推荐一个有趣的Chrome扩展程序-查看任意网站的开发技术栈
查看>>
shell技巧5 - 全自动打包ipa
查看>>
uC/OS-II源码分析(六)
查看>>