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

来源:互联网 发布:1099端口占用 编辑:程序博客网 时间:2024/05/17 04:56

题目:输入一个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
原创粉丝点击