输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。

要求不能创建任何新的结点,只能调整树中结点指针的指向

/*
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* pLastNodeSlist=NULL;
CovertNode(pRootOfTree,&pLastNodeSlist);
//需要返回头结点
TreeNode* pHeadOfList=pLastNodeSlist;
while(pHeadOfList!=NULL&&pHeadOfList->left!=NULL)
{
pHeadOfList=pHeadOfList->left;
}
return pHeadOfList;
}
void CovertNode(TreeNode* pNode, TreeNode** pLastNodeSlist)
{
//判空
if( pNode==NULL)
{
return ;
}
TreeNode* pCurrent=pNode;
//遍历左子树
if(pCurrent->left!=NULL)
{
CovertNode(pCurrent->left,pLastNodeSlist);
}
//根节点的衔接
pCurrent->left=*pLastNodeSlist;
if(*pLastNodeSlist!=NULL)
{
(*pLastNodeSlist)->right=pCurrent;
}
*pLastNodeSlist=pCurrent;
//右子树的遍历
if(pCurrent->right!=NULL)
{
CovertNode(pCurrent->right,pLastNodeSlist);
}
}
};

猜你喜欢

转载自blog.csdn.net/pigdwh/article/details/82077949