题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
分析:中序遍历二叉树,用两个指针cur,pre分别记录当前节点和前一个节点的信息。
1、当前节点的左子节点指向上一次访问的节点;
2、将上一次访问节点的右子节点指向当前节点;
3、最后更新上一次访问节点为当前节点。
/*
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* pre = nullptr;
convertHelper(pRootOfTree, pre);
TreeNode* res = pRootOfTree;
while(res ->left) //返回头结点
res = res ->left;
return res;
}
void convertHelper(TreeNode* cur, TreeNode*& pre)
{
if(cur == nullptr) return;
convertHelper(cur ->left, pre); //中序遍历
cur ->left = pre; //当前节点的左子节点指向上一次访问的节点
if(pre) pre ->right = cur; // 将上一次访问节点的右子节点指向当前节点
pre = cur; //更新上一次访问节点为当前节点
convertHelper(cur ->right, pre);
}
};