剑指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);
   }
};


二叉搜索树与双向链表(java版)

题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。 分析:      对于二叉搜索树,用中序搜索...
  • hll174
  • hll174
  • 2016年03月27日 22:18
  • 980

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

题目: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表,要求不能创建任何新节点,只能调整树中结点指针的指向。最后输出排序后双向链表。 基本思想: 二叉树中每个节点都有两个...
  • wtyvhreal
  • wtyvhreal
  • 2015年05月11日 22:19
  • 874

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

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

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

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

二叉搜索树与双向链表Java

题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的方向。 思路:在二叉搜索树中,左子结点的值总是小于父子结点的值,右子结点的值总是大于...
  • u013238950
  • u013238950
  • 2016年03月08日 18:51
  • 852

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

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

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

题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。解题思路1,有序且为二叉搜索树,则只要使用二叉搜索树的中序遍历即可 2,二叉...
  • sinat_33087001
  • sinat_33087001
  • 2017年08月20日 22:58
  • 70

剑指Offer--027-二叉搜索树与双向链表

链接 牛客OJ:复杂链表的复制 九度OJ:http://ac.jobdu.com/problem.php?pid=1524 GitHub代码: 026-复杂链表的复制 ...
  • gatieme
  • gatieme
  • 2016年04月24日 17:18
  • 4143

剑指Offer_26_二叉搜索树与双向链表

题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。解题思路中序遍历就是数据递增(非递减)出现的,每次记录上一次出现的值,也即当前...
  • ggmfengyangdi
  • ggmfengyangdi
  • 2016年08月17日 10:30
  • 49

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

1.题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。 二叉搜索树的结构如下:struct TreeNode { ...
  • u012311410
  • u012311410
  • 2017年05月01日 12:31
  • 53
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:剑指offer-27二叉搜索树与双向链表
举报原因:
原因补充:

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