一、题目
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
二、图示

三、代码部分
class Solution {
public:
// pPrev标记刚刚转化的节点,pRoot表示现在要转化的二叉树,pRoot前一个处理的节点是pPrev
void _Convert(TreeNode* pRoot, TreeNode*& pPrev)
{
// 空树:不用转化,直接返回
if (nullptr == pRoot)
return;
// 将pRoot的左子树转化为双向链表
_Convert(pRoot->left, pPrev);
// pRoot的left指向其前一个处理的节点,即pPrev
// pRoot的right域没有办法在本次递归中处理,因为下一个节点不知道
// 在本次中只能处理当前节点的left
pRoot->left = pPrev;
// 前一个节点的right指针域没有处理,right指针域指向后一个节点,即pRoot
if (pPrev)
pPrev->right = pRoot;
pPrev = pRoot;
// 将pRoot的右子树转化为双向链表
_Convert(pRoot->right, pPrev);
}
TreeNode* Convert(TreeNode* pRootOfTree)
{
if (nullptr == pRootOfTree)
return nullptr;
// 找双向链表的第一个节点,即树中最小的节点
TreeNode* pHead = pRootOfTree;
while (pHead->left)
pHead = pHead->left;
// 使用prev标记刚刚转化过的节点
TreeNode* prev = nullptr;
_Convert(pRootOfTree, prev);
return pHead;
}
};
该文章描述了一个算法问题,即如何在不创建新节点的情况下,将一棵二叉搜索树转换成一个排序的双向链表。方法是通过递归地处理左子树和右子树,调整节点的左右指针,最终找到链表的头节点(树中的最小节点)。
&spm=1001.2101.3001.5002&articleId=107208509&d=1&t=3&u=e0257b55eaef4b05b1b0d76c625a5128)
313

被折叠的 条评论
为什么被折叠?



