二叉树搜索树转换成排序双向链表(附图)

该文章描述了一个算法问题,即如何在不创建新节点的情况下,将一棵二叉搜索树转换成一个排序的双向链表。方法是通过递归地处理左子树和右子树,调整节点的左右指针,最终找到链表的头节点(树中的最小节点)。

一、题目
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
二、图示
在这里插入图片描述
三、代码部分

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;
	}
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值