题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
分析:递归
/*
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)
{
if(pRootOfTree==NULL){//假如根节点为空,返回空
return NULL;
}
if(pRootOfTree->left==NULL&&pRootOfTree->right==NULL){//假如只有一个根节点,则返回根节点
return pRootOfTree;
}
//1、将左子树构造成双链表,并返回该链表头结点left
TreeNode* left=Convert(pRootOfTree->left);
//2、定位到左子树链表的最后一个节点(左子树最右边的节点)
TreeNode* pLastNode=left;//创建一个临时节点pLastNode,用来遍历找到左链表的最后一个节点(左子树最右边的节点),pLastNode初始化指向做左子树的根节点,
while(pLastNode!=NULL&&pLastNode->right!=NULL){
pLastNode=pLastNode->right;//最终pLastNode为左子树最右边的节点
}
//3、如果左子树链表不为空,将当前pRootOfTree追加到左子树链表后
if(left!=NULL){//左子树链表不为空
pLastNode->right=pRootOfTree;//左子树链表的最后一个节点pLastNode(左子树最右边节点)的右指针指向当前pRootOfTree节点
pRootOfTree->left=pLastNode;//当前pRootOfTree节点的左指针指向左子树链表的最后一个节点pLastNode(左子树最右边节点)
}
//4、将右子树构造成双链表,并返回该链表的头结点right
TreeNode* right=Convert(pRootOfTree->right);
//5、如果右子树链表不为空,将右子树链表追加到当前pRootOfTree后
if(right!=NULL){//右子树链表不为空
right->left=pRootOfTree;//右子树链表的头结点right的左指针指向当前pRootOfTree
pRootOfTree->right=right;//当前pRootOfTree的右指针指向右子树链表的头结点right
}
if(left!=NULL){
return left;
}
else{
return pRootOfTree;
}//根据左子树链表是否为空返回整个双向链表的头指针。
}
};