二叉搜索树与双向链表

本文介绍了如何通过递归方法将二叉搜索树的中序遍历线索化,以便将其转化为双向链表,包括设置前驱和后继指针的过程。
摘要由CSDN通过智能技术生成

二叉搜索树与双向链表_牛客题霸_牛客网 (nowcoder.com)

 

 如题目所述,本题是中序的线索化。

1、如果没有前驱或后继指针,也就是中序遍历中没有前一个节点或后一个节点,则前驱指针和后继指针为空指针。

2、如果有前驱、后继指针,根据中序遍历,前驱指针指向中序遍历的前一个节点,后继指针指向中序遍历的后一个节点。

InorderConvert:我们用参数 prev 来表示节点的前驱节点,prev初始化为 nullptr

由中序遍历的递归写法,先找到链表的头节点  4 ,根据二叉树的中序遍历,4 并没有前驱节点,所以此时 prev 仍为空指针,我们让 cur 的前驱指针指向prev,接着递归,返回上一层。

递归后 cur 为6,prev为 4,此时我们找到了  4  的后继节点,于是我们让 prev 的后继指针指向cur,cur  的前驱指针指向  prev,这样就把4的前驱和后继都处理好了, 接着让 prev = cur ,便于下一步递归,这里就显现了参数传引用的好处。

递归结束后,链表也建立好了,我们用 while 循环来找链表的头节点,头节点是函数 Convert 的返回值,while 里面的两个条件是为了避免空指针的解引用。

class Solution {
public:
	void InorderConvert(TreeNode* cur,TreeNode*& prev)
	{
		if(cur==nullptr)
			return;

		//中序遍历
		InorderConvert(cur->left,prev);
		cur->left=prev;//前驱
		if(prev)
			prev->right=cur;//后继
		
		prev=cur;//prev迭代
		InorderConvert(cur->right,prev);
	}
    TreeNode* Convert(TreeNode* pRootOfTree) {
		TreeNode* prev=nullptr;
        InorderConvert(pRootOfTree,prev);
		//找二叉树转换为链表后的头
		TreeNode*head=pRootOfTree;
		while(head&&head->left)
		{
			head=head->left;
		}
		return head;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值