九:二叉搜索树与双向链表(二叉搜索树转为有序双向链表)

原创 2015年07月10日 10:22:37

问题描述:

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

 

解析:

借助二叉树中序遍历,因为中序遍历二叉搜索树的特点就是从小到大访问结点。当遍历访问到根结点时,假设根结点的左侧已经处理好,只需将根结点与上次访问的最近结点(左子树中最大值结点)的指针连接好即可。进而更新当前链表的最后一个结点指针。

 

递归算法:

(1)中序遍历。

(2)原先指向左子结点的指针调整为链表中指向前一个结点的指针,原先指向右子结点的指针调整为链表中指向下一个结点的指针。

 

代码如下:

void ConvertNode(BinaryTreeNode* pNode,BinaryTreeNode** pLastNodeInList)

{

    if(pNode ==NULL)

        return;

 

BinaryTreeNode *pCurrent = pNode;

 

//中序遍历

    if(pCurrent->m_pLeft != NULL)

       ConvertNode(pCurrent->m_pLeft, pLastNodeInList);

 

//原先指向左子结点的指针调整为链表中指向前一个结点的指针

pCurrent->m_pLeft = *pLastNodeInList;

 

//原先指向右子结点的指针调整为链表中指向下一个结点的指针

   if(*pLastNodeInList != NULL)

       (*pLastNodeInList)->m_pRight = pCurrent;

 

//更新当前链表的最后一个结点指针

   *pLastNodeInList = pCurrent;

 

    if(pCurrent->m_pRight != NULL)

        ConvertNode(pCurrent->m_pRight,pLastNodeInList);

}

 

BinaryTreeNode* Convert(BinaryTreeNode* pRootOfTree)

{

   BinaryTreeNode *pLastNodeInList = NULL;

   ConvertNode(pRootOfTree, &pLastNodeInList);

 

 //pLastNodeInList指向双向链表的尾结点,我们需要返回头结点

   BinaryTreeNode *pHeadOfList = pLastNodeInList;

   while(pHeadOfList != NULL && pHeadOfList->m_pLeft != NULL)

       pHeadOfList = pHeadOfList->m_pLeft;

 

    return pHeadOfList;

}

 

二叉搜索树 转为 双向链表,

  • 2016年04月24日 23:01
  • 1KB
  • 下载

二叉搜索树转换为有序双向链表

一、问题描述 输入一棵二叉搜索树,现在要将该二叉搜索树转换成一个排序的双向链表。而且在转换的过程中,不能创建任何新的结点,只能调整树中的结点指针的指向来实现。 二、实现思路 在二叉搜索树...
  • ljianhui
  • ljianhui
  • 2014年03月28日 00:04
  • 17074

笔试面试算法经典--二叉搜索树转有序的双向链表(Java)

题目: 输入一棵二叉搜索树,将该二叉搜索树转换为一个排序的双向链表。要求:不能创建任何新的结点,只能调整树中结点指针的指向。如下图:解法1(非递归): 思想:二叉搜索树的中序遍历是一个有序的数组,...

【剑指offer】二叉搜索树转双向链表

思路:这道题目关键在于不能创建新的节点,如不然,我们可以直接将二叉排序树中序遍历保存到一个数组中,而后再建立一个双性链表,将数据保存到双向链表里。 这里不能创建新节点,我们只能改变节点的指向左...

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

【试题描述】 将二叉搜索树转换为双向链表 对于二叉搜索树,可以将其转换为双向链表,其中,节点的左子树指针在链表中指向前一个节点,右子树指针在链表中指向后一个节点。   思路一: 采用递归思...
  • zwqjoy1
  • zwqjoy1
  • 2017年12月01日 17:44
  • 12

剑指offer之面试题27:二叉搜索树与双向链表

题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。思路:采用中序遍历的思想(二叉搜索树中序遍历有序)。假设某一时刻遍历到根结点(...

剑指offer刷题之c实现的二叉搜索树转换成双向链表

题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。 参考文献:剑指offer 何海涛老师 P152 思路:将...

常见算法-将二叉搜索树转化为排序的双向链表(java版)

常见算法-将二叉搜索树转化为排序的双向链表(java版) 本篇博文主要在参考下面这篇总结二叉树常见算法题的博文基础上修改而成,这篇文章总结得非常棒,建议大家都读读-[面试大总结之二:Java搞定面...

《编程之美》——二叉搜索树转换为排序双向链表

题目: 输入一棵二叉搜索树,将该二叉搜索树转换为一个排序的双向链表。要求不能创建任何新的节点,只能调整树中指针的指向。分析与解法: 1、由于要求链表是有序的,可以借助二叉树中序遍历,因为中序遍...

二叉搜索树转双向链表(面试题27)

BSTreeNode *ConvertNode(BSTreeNode *pNode,bool asRight) { if(!pNode) { retur...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:九:二叉搜索树与双向链表(二叉搜索树转为有序双向链表)
举报原因:
原因补充:

(最多只允许输入30个字)