关闭

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

81人阅读 评论(0) 收藏 举报
分类:

题目:输入一个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);
   }
};


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1300次
    • 积分:97
    • 等级:
    • 排名:千里之外
    • 原创:9篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档