牛客——二叉树搜索树转换成排序双向链表

文章描述了一种在O(1)空间复杂度下将二叉搜索树转换为双向链表的方法。通过中序遍历,使用一个额外的指针front记录前一个遍历过的节点,递归地连接节点的左右子树。在遍历过程中,更新节点的左右指针,形成链表结构。最后返回链表的头节点。

JZ36 二叉搜索树与双向链表
在这里插入图片描述
这道题要求空间复杂度为O(1),如果没有这个条件可以创建一个vector将所有结点放进去之后进行操作。
所以这道题的思路可以用一个节点来指向上一个经过的结点,用于链接两个结点。
我们创建出一个指针front,这个指针指向的是中序遍历中的指针的上一个位置,用于前后进行链接。
用递归。
在这里插入图片描述
遍历的结点遍历完左再向右,向右的过程中,正好到了4的位置,4的左指针指向前驱,前驱是什么都没有,所以指向空就可以了,然后让右指针指向父节点,这个时候我们并不知道父节点,那么这时可以将指针front指向这里,然后本身返回上一层访问的就是父节点(这里是6),这个时候本来是要访问右子树的,在这个过程中让front指针的右指针指向该节点,就完成了一次链接,以此循环就可以了。
最后一步退出之后front指向16的结点,该节点没有后继,所以不需要指向空指针。(这里其实随意)

/*
struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(int x) :
			val(x), left(NULL), right(NULL) {
	}
};*/
class Solution {
public:
	void linked(TreeNode* root, TreeNode*& front)
	{
		if(root == nullptr)
			return ;
		linked(root->left, front);
		root->left =  front;
		if(front)//如果front为空就说明不需要让front指向谁
			front->right = root;
		front = root;
		linked(root->right, front);
	}
    TreeNode* Convert(TreeNode* pRootOfTree) {
        TreeNode* front = nullptr;
		TreeNode* root = pRootOfTree;
		linked(root, front);
		while(root && root->left)//找到链表表头
			root = root->left;
		return root;
    }
};

在这里插入图片描述
这里的前缀结点指针front必须加一个引用,因为在递归的时候返回上一层要将front的位置也带回去,如果不带引用上一层储存的就不是当前层的front所指向的位置了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ℳℓ白ℳℓ夜ℳℓ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值