地址:https://www.acwing.com/problem/content/87/

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。

要求不能创建任何新的结点,只能调整树中结点指针的指向。

注意:

  • 需要返回双向链表最左侧的节点。

例如,输入下图中左边的二叉搜索树,则输出右边的排序双向链表。

解法

树的处理 一半都是递归  分为 根  树的左子树 和树的右子树

子树也是一棵树 进行递归处理  向上返回一个双链表  返回链表的头尾

最后全部转化链表

代码

  1. /**
  2. * Definition for a binary tree node.
  3. * struct TreeNode {
  4. * int val;
  5. * TreeNode *left;
  6. * TreeNode *right;
  7. * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
  8. * };
  9. */
  10. class Solution {
  11. public:
  12.  
  13. TreeNode* rethead = NULL;
  14.  
  15. TreeNode* gleft = NULL;
  16. TreeNode* gright = NULL;
  17.  
  18. void convertInner(TreeNode* root)
  19. {
  20. if (NULL == root) return;
  21.  
  22. if (root->val < rethead->val) rethead = root;
  23.  
  24. if (root->left == NULL && root->right == NULL) {
  25. gleft = root; gright = root;
  26. return;
  27. }
  28. else if (root->left != NULL && root->right == NULL) {
  29. convertInner(root->left);
  30. gright->right = root;
  31. root->left = gright;
  32. gright = root;
  33. }
  34. else if (root->right != NULL && root->left == NULL) {
  35. convertInner(root->right);
  36. gleft->left = root;
  37. root->right = gleft;
  38. gleft = root;
  39. }
  40. else if (root->right != NULL && root->left != NULL) {
  41. convertInner(root->left);
  42. gright->right = root;
  43. root->left = gright;
  44.  
  45. TreeNode* leftcopy = gleft;
  46.  
  47. convertInner(root->right);
  48. gleft->left = root;
  49. root->right = gleft;
  50. gleft = leftcopy;
  51. }
  52. }
  53.  
  54. TreeNode* convert(TreeNode* root) {
  55. if (NULL == root) return NULL;
  56. rethead = root;
  57.  
  58. if (root->left == NULL && root->right == NULL) return root;
  59.  
  60. if (root->left != NULL && root->right == NULL) {
  61. convertInner(root->left);
  62. gright->right = root;
  63. root->left = gright;
  64. }
  65. else if (root->right != NULL && root->left == NULL) {
  66. convertInner(root->right);
  67. gleft->left = root;
  68. root->right = gleft;
  69. }
  70. else if (root->right != NULL && root->left != NULL) {
  71. convertInner(root->left);
  72. gright->right = root;
  73. root->left = gright;
  74.  
  75. convertInner(root->right);
  76. gleft->left = root;
  77. root->right = gleft;
  78. }
  79.  
  80. return rethead;
  81. }
  82.  
  83. };
  1. /**
  2. * Definition for a binary tree node.
  3. * struct TreeNode {
  4. * int val;
  5. * TreeNode *left;
  6. * TreeNode *right;
  7. * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
  8. * };
  9. */
  10. class Solution {
  11. public:
  12.  
  13. TreeNode* rethead = NULL;
  14.  
  15. TreeNode* gleft = NULL;
  16. TreeNode* gright = NULL;
  17.  
  18. void convertInner(TreeNode* root)
  19. {
  20. if (NULL == root) return;
  21.  
  22. if (root->val < rethead->val) rethead = root;
  23.  
  24. if (root->left == NULL && root->right == NULL) {
  25. gleft = root; gright = root;
  26. return;
  27. }
  28. else if (root->left != NULL && root->right == NULL) {
  29. convertInner(root->left);
  30. gright->right = root;
  31. root->left = gright;
  32. gright = root;
  33. }
  34. else if (root->right != NULL && root->left == NULL) {
  35. convertInner(root->right);
  36. gleft->left = root;
  37. root->right = gleft;
  38. gleft = root;
  39. }
  40. else if (root->right != NULL && root->left != NULL) {
  41. convertInner(root->left);
  42. gright->right = root;
  43. root->left = gright;
  44.  
  45. TreeNode* leftcopy = gleft;
  46.  
  47. convertInner(root->right);
  48. gleft->left = root;
  49. root->right = gleft;
  50. gleft = leftcopy;
  51. }
  52. }
  53.  
  54. TreeNode* convert(TreeNode* root) {
  55. if (NULL == root) return NULL;
  56. rethead = root;
  57.  
  58. if (root->left == NULL && root->right == NULL) return root;
  59.  
  60. if (root->left != NULL && root->right == NULL) {
  61. convertInner(root->left);
  62. gright->right = root;
  63. root->left = gright;
  64. }
  65. else if (root->right != NULL && root->left == NULL) {
  66. convertInner(root->right);
  67. gleft->left = root;
  68. root->right = gleft;
  69. }
  70. else if (root->right != NULL && root->left != NULL) {
  71. convertInner(root->left);
  72. gright->right = root;
  73. root->left = gright;
  74.  
  75. convertInner(root->right);
  76. gleft->left = root;
  77. root->right = gleft;
  78. }
  79.  
  80. return rethead;
  81. }
  82.  
  83. };

acwing 49. 二叉搜索树与双向链表的更多相关文章

  1. 剑指Offer面试题:25.二叉搜索树与双向链表

    一.题目:二叉搜索树与双向链表 题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向.比如输入下图中左边的二叉搜索树,则输出转换之后的 ...

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

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

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

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

  4. 【IT笔试面试题整理】二叉搜索树转换为双向链表

    [试题描述] 将二叉搜索树转换为双向链表 对于二叉搜索树,可以将其转换为双向链表,其中,节点的左子树指针在链表中指向前一个节点,右子树指针在链表中指向后一个节点. 思路一: 采用递归思想,对于二叉搜索 ...

  5. 《剑指offer》— JavaScript(26)二叉搜索树与双向链表

    二叉搜索树与双向链表 题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 思路 递归思想:把大问题转换为若干小问题: 由于Ja ...

  6. 《剑指offer》第三十六题(二叉搜索树与双向链表)

    // 面试题36:二叉搜索树与双向链表 // 题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求 // 不能创建任何新的结点,只能调整树中结点指针的指向. #include < ...

  7. 编程算法 - 二叉搜索树 与 双向链表 代码(C++)

    二叉搜索树 与 双向链表 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 题目:输入一颗二叉搜索树, 将该二叉搜索树转换成一个排序的双向链表. 要求 ...

  8. 【剑指offer】二叉搜索树转双向链表,C++实现

    原创博文,转载请注明出处! # 题目 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 二叉树节点的定义 struct TreeNod ...

  9. 剑指Offer - 九度1503 - 二叉搜索树与双向链表

    剑指Offer - 九度1503 - 二叉搜索树与双向链表2014-02-05 23:39 题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树 ...

随机推荐

  1. Java并发面试问题,谈谈你对AQS的理解

    本人免费整理了Java高级资料,涵盖了Java.Redis.MongoDB.MySQL.Zookeeper.Spring Cloud.Dubbo高并发分布式等教程,一共30G,需要自己领取.传送门:h ...

  2. spring的事物管理配置

    基于注解的事务管理器配置(AOP) 首先要引入AOP和TX的名称控件 <!-- 使用annotation定义事务 --> <tx:annotation-driven transact ...

  3. [转]UiPath Keyboard Shortcuts

    本文转自:https://docs.uipath.com/studio/docs/keyboard-shortcuts The complete list of keyboard shortcuts ...

  4. 在服务器的tomcat中部署手机apk项目,浏览器或手机下载不能根据URL下载和安装apk文件

    Android的APK包不能下载或安装,需在tomcat的web.xml加入 <mime-mapping>        <extension>apk</extensio ...

  5. 12c Data guard Switchover Best Practices using SQLPLUS (Doc ID 1578787.1)

    12c Data guard Switchover Best Practices using SQLPLUS (Doc ID 1578787.1) APPLIES TO: Oracle Databas ...

  6. springmvc+mybatis需要的jar包与详解

    https://www.cnblogs.com/luohengstudy/p/7772109.html

  7. c++ LeetCode(初级数组篇)十一道算法例题代码详解(一)

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/10940636.html 唉!最近忙着面试找实习,然后都是面试的很多是leetcode的算法题, ...

  8. Kafka基本知识整理

    首先Kafka是一个分布式消息队列中间件,Apache顶级项目,https://kafka.apache.org/   高性能.持久化.多副本备份.横向扩展. 生产者Producer往队列里发送消息, ...

  9. RabbitMQ的高级特性概念理解

    1.RabbitMQ中的消息如何保障百分之百的投递成功? 答:百分之百的投递成功,方案可以参考下面的2.3. 2.什么是生产者端的可靠性投递? 答:第一步,生产者保障消息的成功发出.第二步,保障Rab ...

  10. SAP 表汇总

    SAP 表整理:VBKPF-预制凭证抬头表: VBKPF-预制凭证抬头表 VBKPF-预制凭证抬头表 VBSEG-预制凭证行项目表: VBSEG-预制凭证行项目表 VBSEG-预制凭证行项目表 VBS ...