您的位置:首页 > Web前端

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

2016-06-01 21:59 302 查看
题目:输入一个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);
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: