剑指offer-27二叉搜索树与双向链表

原创 2016年06月01日 21:59:38

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

由于要求转换后的链表是排序的,而中序遍历可以从小到大遍历二叉树的每个节点,因此可以中序遍历该二叉树。

当遍历到根节点时,它的左子树已经转换成一个排序的链表,把链表的最后结点与根节点相连即把根节点加入排序链表,接着遍历转换右子树,转换左子树和右子树可以用递归的方法完成。

代码如下:

/*
struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(int x) :
			val(x), left(NULL), right(NULL) {
	}
};*/
class Solution {
public:
    TreeNode* Convert(TreeNode* pRootOfTree)
    {
        //指向双链表的尾节点
        TreeNode* LastNodeInList=NULL;
        ConvertTree(pRootOfTree,&LastNodeInList);
        TreeNode* Head=LastNodeInList;
        while(Head!=NULL&&Head->left!=NULL)
            Head=Head->left;
        return Head;
        
    }
   void ConvertTree(TreeNode* pRoot,TreeNode** LastNodeInList)
   {
       if(pRoot==NULL)
           return;
       TreeNode* Current=pRoot;
       //若当前节点的左孩子不为空,继续递归调用
       if(Current->left!=NULL)
           ConvertTree(Current->left,LastNodeInList);
       
       //将当前节点的左孩子设为双链表的尾节点
       Current->left=*LastNodeInList;
       //如果尾节点不为空的话,将尾节点的右孩子设为当前节点
       if((*LastNodeInList)!=NULL)
           (*LastNodeInList)->right=Current;
       //尾节点设为当前节点
       (*LastNodeInList)=Current;
       //若当前节点还有右孩子,则继续递归调用
       if(Current->right!=NULL)
           ConvertTree(Current->right,LastNodeInList);
   }
};


相关文章推荐

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

问题描述:输入一颗二叉搜索树,将该二叉搜索树转换为一个排序的双向链表。...
  • WSYW126
  • WSYW126
  • 2016年05月12日 13:50
  • 212

剑指Offer面试题26复杂链表的复制,面试题27二叉搜索树和双向链表(递归)

面试题26:复杂链表的复制 复制一个复杂链表,这个链表除了next指针,还有指向任意一个结点的sibling指针或空指针。 思路1:一个效率很低的方法:分两步,先复制一遍next链表,然后设置si...

剑指offer系列之二十五:二叉搜索树与双向链表

题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。由于二叉搜索树的中序遍历就是排序的,如果是构造单链表,只需要一次中序遍历就可以...

【剑指Offer】二叉搜索树与双向链表

题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。算法描述使用递归,分别去将当前节点的左右子树变成双向链表,然后获取左边链表的最...

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

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

牛客--剑指offer-二叉搜索树和双向链表

一、问题描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。 二、解题思路 将二叉搜索树转换成双向链表,其实就是按照中序遍历的方式来...

剑指offer:二叉搜索树与双向链表(java)

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

剑指offer--面试题27:二叉搜索树与双向链表--Java实现

题目描述:输入一颗二叉搜索树,将二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。思路:原先指向左子结点的指针调整为链表中指向前一个结点的指针,原先指向右子结点...

《剑指offer》二叉搜索树与双向链表

【 声明:版权所有,转载请标明出处,请勿用于商业用途。  联系信箱:libin493073668@sina.com】 题目链接:http://www.nowcoder.com/p...

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

/* 二叉搜索树与双向链表: 输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中 节点指针的指向。比如,输入图中左边的二叉搜索树,则输出转换之后的排序双...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:剑指offer-27二叉搜索树与双向链表
举报原因:
原因补充:

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