题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
考察点:复杂问题简化;二叉树和双向链表的掌握。
思路:把树分为跟节点,左子树,右子树。递归转换。
struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
class Solution {
public:
void ConvertNode(TreeNode* pNode, TreeNode** pLastNodeInList) //进行转换
{
if (pNode == NULL)
return;
TreeNode* pCurrent = pNode;//获取当前节点
if (pCurrent->left != NULL)//当前节点的左孩子不为空,递归转换左子树
ConvertNode(pCurrent->left, pLastNodeInList);
pCurrent->left = *pLastNodeInList; //修改左指针
if (*pLastNodeInList != NULL) //修改右指针
(*pLastNodeInList)->right = pCurrent;
*pLastNodeInList = pCurrent;//更新最后一个指针的地址
if (pCurrent->right) //右孩子不为空。递归转换右子树
ConvertNode(pCurrent->right, pLastNodeInList);
}
TreeNode* Convert(TreeNode* pRootOfTree)
{
TreeNode* pLastNodeInList = NULL;//初始化
ConvertNode(pRootOfTree, &pLastNodeInList);//得到链条中最后一个节点的位置
TreeNode* pHeadOfList = pLastNodeInList;//反转,从最后一个节点转为前面
while (pHeadOfList != NULL && pHeadOfList->left != NULL)
pHeadOfList = pHeadOfList->left;
return pHeadOfList;
}
};