【题目】
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
【思路】
根据二叉搜索树的特点:左节点的值 < 根节点的值 < 右节点的值,使用二叉树的中序遍历出来的数据就是排序好(从小到大)的顺序。因此,确定了二叉搜索树的遍历方法。
遍历时可以用一个引用的指针来存储上一个节点,这样就可以和当前节点建立双向关系。
【代码】
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(nullptr), right(nullptr) {
}
};*/
class Solution {
public:
TreeNode* Convert(TreeNode* pRootOfTree){
if (pRootOfTree == nullptr) {
return nullptr;
}
TreeNode *pLastNodeInList = nullptr;
ConvertNode(pRootOfTree, pLastNodeInList);
// 返回头结点
TreeNode *pHead = pLastNodeInList;
while (pHead->left != nullptr){
pHead = pHead->left;
}
return pHead;
}
void ConvertNode(TreeNode *pNode, TreeNode *&pLastNodeInList) {
if (pNode == nullptr) {
return;
}
// 左递归
ConvertNode(pNode->left, pLastNodeInList);
// 左指针
pNode->left = pLastNodeInList;
// 右指针
if (pLastNodeInList != nullptr) {
pLastNodeInList->right = pNode;
}
// 更新pLastNodeInList
pLastNodeInList = pNode;
// 右递归
ConvertNode(pNode->right, pLastNodeInList);
}
};