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

分析:如下图

因为是二叉搜索树。所以树的排列是规则的。通过中序遍历正好遍历的是由小到大的序列。

要求说明是只能改变树结点指针的指向,不能增加新的空间和结点。所以在中序遍历的时候,主要是遍历到结点后就去改变指针指向。

为了简单,采用递归进行遍历。

树的结构

struct BinaryTreeNode{int m_data;BinaryTreeNode* m_LeftNode;BinaryTreeNode* m_RightNode;
};

下面这部分代码是总体框架

BinaryTreeNode* TransTreeToList(BinaryTreeNode* pBinaryTree)
{if (pBinaryTree == NULL)return NULL;BinaryTreeNode *pLastNodeInList = NULL;TransTreeToList(pBinaryTree, &pLastNodeInList);    //pLastNodeInList指向双向链表的尾结点//找到链表的头结点BinaryTreeNode* pHeadNode = pLastNodeInList;if (pHeadNode == NULL)return;while (pHeadNode->m_LeftNode != NULL)pHeadNode = pHeadNode->m_LeftNode;
}

下面部分代码是详细的设计

void TransTreeToList(BinaryTreeNode* pNode, BinaryTreeNode** pLastNodeInList)
{if (pNode == NULL)return;BinaryTreeNode* pCurrent = pNode;                                  //根节点//下面所有代码是采用中序遍历的递归方法,仅仅不同的只是每次递归都将pLastNodeInList放到链表的最左边。if (pCurrent->m_LeftNode != NULL)                                  //找到最左子树TransTreeToList(pCurrent->m_LeftNode, pLastNodeInList);//下面三行代码表示将pLastNodeInList加到最左边pCurrent->m_LeftNode = *pLastNodeInList;                      if (*pLastNodeInList != NULL)(*pLastNodeInList)->m_RightNode = pCurrent;                    //因为是双向链表,所以pLastNodeInList要向右指向当前结点*pLastNodeInList = pCurrent;                                       //再遍历根节点,此时*pLastNodeInList为根节点,也就是在没有遍历右子树之前最后的一个结点。if(pCurrent->m_RightNode != NULL)                                  //再遍历右子树TransTreeToList(pCurrent->m_RightNode,pLastNodeInList);
}

代码简单分析:

总体的步骤还是采用中序递归遍历。先遍历左边结点,接着将左边结点加到根节点的最左边,变成双向指针。接下来pLastNodeInList指向链表的最右边。接下来再遍历右子树,将pLastNodeInList加到右子树的最左边,这样递归下去。

总之要明白整个代码是按照中序递归遍历的,过程中仅仅就是改变了指针方向。不要过分追究过程细节。

时间复杂度分析:

该算法首先从根要点一直向左走,找到最左边的结点,其时间复杂度为O(logN),然后对二叉排序树中的每个结点遍历一次,进行指针变换,其时间复杂度为O(N),所以总的时间复杂度为O(N)

参考:http://blog.csdn.net/ljianhui/article/details/22338405

剑指offer

void TransTree2List(Tree *pTree)
{if( NULL == pTree )return ;TransTree2List(pTree->leftTree);Convert2List(pTree);TransTree2List(pTree->rightTree);
}Tree *pHead = NULL;
Tree *pIndex = NULL ;
void Convert2List(Tree *pTreeNode)
{pIndex = pTreeNode->leftTree ;if (NULL == pIndex)pHead = pTreeNode ;elsepIndex->rightTree = pTreeNode;pHead = pTreeNode ;
}

  

转载于:https://www.cnblogs.com/menghuizuotian/p/3799587.html

二叉搜索树与双向链表的转换相关推荐

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

    题目: 二叉搜索树与双向链表 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表.要求不能创建任何新的节点,只能调整树中节点指针的指向. 为了让您更好地理解问题,以下面的二叉搜索树为例: ...

  2. 面试题27.二叉搜索树与双向链表

    题目:输入一颗二叉搜索树,将该二叉搜索树转换为一个排序的双向链表.要求不能创建 任何新的结点,只能调整树种结点指针的指向.比如输入下图的二叉搜索树,则输出转换 后的双向排序链表. 1 10 2 / \ ...

  3. [二叉树]二叉搜索树转换为双向链表(剑指Offer26)

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

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

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

  5. java 双向链表_Day26:二叉搜索树与双向链表

    剑指Offer_编程题--二叉搜索树与双向链表 题目描述: 输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的节点.只能调整树中节点指针的指向. 具体要求: 时间限制: ...

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

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

  7. java面试(二)--(1)EJB的几种类型(2)Hibernate的悲观锁和乐观锁(3) 二叉搜索树与双向链表

    1.请说明一下EJB的几种类型分别是什么? EJB(Enterprise JavaBean)是J2EE服务器端的组件模型,EJB包括会话Bean(Session Bean).实体Bean(Entity ...

  8. 二叉树OJ(一)二叉树的最大深度 二叉搜索树与双向链表 对称的二叉树

    二叉树的最大深度 二叉树中和为某一值的路径(一) 二叉搜索树与双向链表 对称的二叉树 二叉树的最大深度 描述 求给定二叉树的最大深度, 深度是指树的根节点到任一叶子节点路径上节点的数量. 最大深度是所 ...

  9. 【剑指offer-C++】JZ36:二叉搜索树与双向链表

    [剑指offer-C++]JZ36:二叉搜索树与双向链表 题目描述 解题思路 题目描述 描述:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.如下图所示: 数据范围:输入二叉树的节点数 0 ...

最新文章

  1. 谈博客的赢(盈)利模式
  2. http://www.myeclipseide.com/ 官网打不开的问题(转)
  3. 【MySQl】MyISAM和InnoDB索引对比
  4. 排队问题解题思路_青岛版二年级数学下册8.2除加除减解决问题微课视频辅导+练习...
  5. springmvc注解小示例(转)
  6. 递归获取字符串内的所有图片src地址
  7. request.params 用法
  8. 快速发布发包平台技术论坛
  9. WIFI快连协议层原理
  10. python UI自动化测试-----常见面试题汇总
  11. 洛谷P1894 [USACO4.2]完美的牛栏The Perfect Stall(二分图最大匹配)
  12. 并查集是什么?怎么模拟实现?如何应用?
  13. 如何在线免费PDF转换PPT
  14. C++编码规范与指导zt
  15. 2018农历新年第一天
  16. 华为b199Android版本,华为B199刷机包 MIUI8安卓6.0插桩适配ROM 7.4.5版
  17. SQL Server全套教程(基于SQL语句----预览版)
  18. 华企会“资源整合赢天下”――龙岩分会发动大会
  19. weui uploader java_Weui 文件上传完整版示例
  20. C# 数据库大作业-学生管理系统

热门文章

  1. 网工七大计策掌握网络管理中的实战技术(转)
  2. 为什么Linux登录后显示“-bash-3.2#”-转
  3. java override报红_Eclipse @override报错解决
  4. Spring中的Bean是如何被回收的?
  5. 蓝桥杯 ADV-175 算法提高 三个整数的排序
  6. python检测端口是否被侦听
  7. HDU 6124 Euler theorem
  8. 【SQL 数据库】将一张数据表信息复制到另一张数据表
  9. 安装keepalived执行make报错的解决方法
  10. cygwin boost