题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
思路:
二叉搜索树(BST):若二叉搜索树根节点的左子树不为空,则根节点的左子树所有节点值均小于根节点值,若根节点的右子树不为空,则根节点的右子树所有节点值均大于根节点;二叉搜索树的中序遍历就是一个升序序列。
利用二叉搜索树的中序遍历是一个升序序列,每次访问根节点的时候只需记录前一个访问的节点并修改对应指针即可,需要注意传参时记录前一个访问位置的指针需要引用
C++
/*
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 == nullptr)
return nullptr;
TreeNode* pPre = nullptr;
ConvertTreeToList(pRootOfTree, pPre);
TreeNode* res = pRootOfTree;//寻找头结点
while(res->left != nullptr)
res = res->left;
return res;
}
void ConvertTreeToList(TreeNode* pNow, TreeNode* &pPre){//pPre要加引用,否则调用结束可能没有变化,一直为空
if(pNow == nullptr)
return;
ConvertTreeToList(pNow->left, pPre);
pNow->left = pPre;
if(pPre != nullptr)
pPre->right = pNow;
pPre = pNow;
ConvertTreeToList(pNow->right, pPre);
}
};