二叉搜索树与双向链表
时间限制:1秒 空间限制:32768K |
题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。 |
题目分析
下面给出一个二叉搜索树转换为双向链表的手工完成图。 |
代码实现
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
void getLastNode(TreeNode* pNode, TreeNode*&pLastNode)
{
// 如果当前节点为空,则直接返回
if (pNode == NULL)
return;
// 如果当前节点有左子树,则获取左子树转换为链表后最右边的节点
if (pNode->left != NULL)
getLastNode(pNode->left, pLastNode);
// 当前节点的左节点为左子树转换为链表后的最右边的节点
pNode->left = pLastNode;
// 如果左子树转换为链表后的最右边的节点不为空,即左子树不为空,链表的最右边的节点指向当前节点
if (pLastNode != NULL)
pLastNode->right = pNode;
// 将当前节点设置为链表的最右边的节点
pLastNode = pNode;
// 如果当前节点的右子树不为空,则获取右子树转换为链表后的最右边的节点
if (pNode->right != NULL)
getLastNode(pNode->right, pLastNode);
}
TreeNode * Convert(TreeNode * pRootOfTree)
{
// 如果根节点为空,则返回空
if (pRootOfTree == NULL)
return NULL;
// 定义链表的最后一个节点并初始化为空
TreeNode* pLastNode = NULL;
// 获取二叉搜索树转换为链表后的最后一个节点
getLastNode(pRootOfTree, pLastNode);
TreeNode* pListHead = NULL;
while (pLastNode->left)
pLastNode = pLastNode->left;
pListHead = pLastNode;
return pLastNode;
}
};