题目:

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

二叉树的定义如下:

struct TreeNode{
int val;
TreeNode* left;
TreeNode* right;
};

思路:

在二叉树中,每个结点都有两个指向子结点的指针,在双向链表中,每个结点也有两个指针,他们分别指向前一个结点和后一个结点。两种数据结构看起来很相似,是可以通过某种方式将二叉搜索树转换为排序的双向链表。

在二叉搜索树中,当遍历到根结点时,把二叉树看成三部分,根结点、左子树和右子树,根据排序链表的定义,根结点的左指针应该指向左子树中最大的结点,即最右边的结点;根结点的右指针应该指向右子树中最小的结点,即最左边的结点。

在把左子树、右子树都转换成排序的双向排序链表(递归)之后,再跟根结点连接起来,整棵二叉搜索树就转换成了排序的双向链表。

因此在设计递归函数时,需要返回链表的头指针和尾指针,并改变当前结点的左右指针的指向。(详见代码)

代码:

#include <iostream>

using namespace std;

struct TreeNode{
int val;
TreeNode* left;
TreeNode* right;
}; TreeNode* ConvertNodes(TreeNode* pRoot,TreeNode** pTail); TreeNode* Convert(TreeNode* pRoot){
TreeNode* pTail=NULL;
return ConvertNodes(pRoot,&pTail);
} TreeNode* ConvertNodes(TreeNode* pRoot,TreeNode** pTail){
if(pRoot==NULL)
return NULL;
if(pRoot->left==NULL && pRoot->right==NULL){
*pTail=pRoot;
return pRoot;
}
TreeNode* leftHead=pRoot;
if(pRoot->left!=NULL){
leftHead=ConvertNodes(pRoot->left,pTail);
pRoot->left=*pTail;
if(*pTail!=NULL)
(*pTail)->right=pRoot;
*pTail=pRoot;
} if(pRoot->right!=NULL){
TreeNode* rightHead=ConvertNodes(pRoot->right,pTail);
pRoot->right=rightHead;
if(rightHead!=NULL)
rightHead->left=pRoot;
}
return leftHead;
}

在线测试OJ:

http://www.nowcoder.com/books/coding-interviews/947f6eb80d944a84850b0538bf0ec3a5?rp=2

AC代码:

class Solution {
public:
TreeNode* Convert(TreeNode* pRootOfTree)
{
TreeNode* pTail=NULL;
return ConvertNodes(pRootOfTree,&pTail);
} TreeNode* ConvertNodes(TreeNode* pRoot,TreeNode** pTail){
if(pRoot==NULL)
return NULL;
if(pRoot->left==NULL && pRoot->right==NULL){
*pTail=pRoot;
return pRoot;
} TreeNode* leftHead=pRoot;
if(pRoot->left!=NULL){
leftHead=ConvertNodes(pRoot->left,pTail);
pRoot->left=*pTail;
if(*pTail!=NULL)
(*pTail)->right=pRoot;
*pTail=pRoot;
} if(pRoot->right!=NULL){
TreeNode* rightHead=ConvertNodes(pRoot->right,pTail);
pRoot->right=rightHead;
if(rightHead!=NULL)
rightHead->left=pRoot;
}
return leftHead;
} };

(剑指Offer)面试题27:二叉搜索树与双向链表的更多相关文章

  1. 剑指Offer:面试题27——二叉搜索树与双向链表(java实现)

    问题描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 思路: 将树分为三部分:左子树,根结点,右子树. 1.我们要把根结点与左 ...

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

    中序递归,一个pre节点记录前一个节点 /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; Tre ...

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

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

  4. 剑指Offer:面试题24——二叉搜索树的后序遍历序列(java实现)

    问题描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true,否则返回false.假设输入的数组的任意两个数字都互不相同. 思路: 1.首先后序遍历的结果是[(左子 ...

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

    题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 题目分析 要生成排序的双向列表,那么只能是中序遍历,因为中序遍历才能从小到 ...

  6. 【剑指Offer】26、二叉搜索树与双向链表

      题目描述:   输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向.   解题思路:   首先要理解此题目的含义,在双向链表中,每个结 ...

  7. 剑指Offer - 九度1367 - 二叉搜索树的后序遍历序列

    剑指Offer - 九度1367 - 二叉搜索树的后序遍历序列2013-11-23 03:16 题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出 ...

  8. 剑指offer(20)二叉搜索树与双向表

    题目: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 思路一:递归法 1.将左子树构造成双链表,并返回链表头节点. 2.定位至左子 ...

  9. 剑指offer(23)二叉搜索树的后序遍历序列

    题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 题目分析 1.后续遍历我们可以知道,最右边的是根节 ...

  10. 剑指offer(62)二叉搜索树的第K个节点

    题目描述 给定一棵二叉搜索树,请找出其中的第k小的结点.例如, (5,3,7,2,4,6,8)    中,按结点数值大小顺序第三小结点的值为4. 题目分析 首先,我们可以先画图.画完图后我们要想办法从 ...

随机推荐

  1. 2015-10-14 晴 tcp/ip

    今天看完ping, traceroute, ip选路,动态选路协议,dup, igmp, tftp, bootp,tcp

  2. Can't locate ExtUtils/MakeMaker.pm

    Can't locate ExtUtils/MakeMaker.pm 解决:yum install perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker

  3. Android下Fragment的动画切换效果

    效果图如下: 源码链接   :    请戳这里

  4. Oracle 11g RAC oc4j/gsd Offline

    Oracle 11g RAC中,发现oc4j以及gsd服务都处于offline状态,这是Oracle 11g RAC默认情形.即便如此,并不影响数据库的使用,因为 oc4j 是用于WLM 的一个资源, ...

  5. JBPM4入门——3.JBPM4开发环境的搭建

    本博文只是简要对JBPM4进行介绍,如需更详细内容请自行google 链接: JBPM入门系列文章: JBPM4入门——1.jbpm简要介绍 JBPM4入门——2.在eclipse中安装绘制jbpm流 ...

  6. POI取消科学计数法

    前台输入手机号13777777777,如果是为Double类型接收,就会自动转为科学计数法 找了下,一般是Double转String,方法一般有两种: 1.利用String.format() sale ...

  7. [Everyday Mathematics]20150303

    设 $f$ 是 $\bbR$ 上的 $T$ - 周期函数, 试证: $$\bex \int_T^\infty\frac{f(x)}{x}\rd x\mbox{ 收敛 } \ra \int_0^T f( ...

  8. mysql优化SQL语句的一般步骤及常用方法

    一.优化SQL语句的一般步骤 1. 通过show status命令了解各种SQL的执行频率 mysqladmin extended-status 或: show [session|global]sta ...

  9. JavaScript/jQuery 表单美化插件小结

    Niceforms Niceforms是一款独立的表单美化工具,当前版本为2.0 官方主页:http://www.emblematiq.com/lab/niceforms/ 官方演示:http://w ...

  10. cocos2dx 2.x 版本+Windows+ADT Bundle 配置

    昨天解决了cocos2dx 3.x版本+Windows+ADT Bundle的配置,今天来解决cocos2dx 2.x版本的配置. 整体来说,2.x的配置相对麻烦一点,不过一旦解决了,就一路畅通无阻了 ...