题目重述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
思路与剑指Offer上一样:
Convert函数返回双向链表的头结点:
递归的过程就相当于按照中序遍历,将整个树分解成了无数的小树,然后将他们分别转化成了一小段一小段的双向链表。再利用tempend记录总的链表的末尾,然后将这些小段链表一个接一个地加到末尾。
核心思路就是参照中序遍历。
注意:将tempend节点定义在函数体外面,类里面的私有处。若定义在 函数体内部会牛客测试会不通过。
代码
class Solution {
public:
TreeNode* Convert(TreeNode* pRootOfTree){
if (pRootOfTree == nullptr)
return nullptr;
//若没有左孩子,则直接让头结点等于根
TreeNode* Head = Convert(pRootOfTree->left);
if (Head == nullptr)
Head = pRootOfTree;
//连接当前pRootOfTree节点与当前尾结点tempend.
pRootOfTree->left = tempend;
if (tempend!=nullptr)
tempend->right = pRootOfTree;
tempend=pRootOfTree;
//对右子树进行链表操作
Convert(pRootOfTree->right);
return Head;
}
private:
TreeNode* tempend = nullptr;
//注意:将tempend节点定义在函数体外面,类里面的私有处。若定义在 函数体内部会牛客测试会不通过。
};