题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
解题思路:
1.将左子树构造成双链表,并返回链表头节点。
2.定位至左子树双链表最后一个节点。
3.如果左子树链表不为空的话,将当前root追加到左子树链表。
4.将右子树构造成双链表,并返回链表头节点。
5.如果右子树链表不为空的话,将该链表追加到root节点之后。
6.根据左子树链表是否为空确定返回的节点。
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;
//将左子树构造成双向链表,并且返回表头
TreeNode *left = Convert(pRootOfTree ->left);
TreeNode *temp = left;
//找到左子树双向链表的表尾
while(temp != NULL && temp ->right != NULL)
temp = temp ->right;
//如果左子树不为空,则将当前root追加到左子树的双向链表的表位
if(left != NULL)
{
temp ->right = pRootOfTree;
pRootOfTree ->left = temp;
}
//找到右子树双向链表的表头
TreeNode *right = Convert(pRootOfTree ->right);
//若果右子树不为空,将右子树的双向链表附加到root的表尾
if(right != NULL)
{
right ->left = pRootOfTree;
pRootOfTree ->right = right;
}
//返回当前的表头
return left == NULL? pRootOfTree : left;
}
};