将二叉搜索树转换成一个排序的双向链表

本文介绍了一种将二叉搜索树转换为双向链表的方法,包括递归和非递归两种实现方式。递归方法通过左右子树递归调用并连接节点来完成转换;非递归方法则利用栈进行中序遍历,巧妙地实现了节点间的链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(int x) :
			val(x), left(NULL), right(NULL) {
	}
};*/

//递归解法
TreeNode* convertNode(TreeNode* root){
	if (NULL == root)
		return NULL;
	if (root->left){
		TreeNode* leftNode = convertNode(root->left);
		while (leftNode->right)
			leftNode = leftNode->right;
		leftNode->right = root;
		root->left = leftNode;
	}

	if (root->right)
	{
		TreeNode *rightNode = convertNode(root->right);
		while (rightNode->left) 
			rightNode = rightNode->left;
		rightNode->left = root;
		root->right = rightNode;
	}
	return root;

}
TreeNode* Convert(TreeNode* pRootOfTree)
{
	if (NULL == pRootOfTree)
	{
		return NULL;
	}

	pRootOfTree = convertNode(pRootOfTree);

	while (pRootOfTree->left)
	{
		pRootOfTree = pRootOfTree->left;
	}
	return pRootOfTree;
}


//非递归解法
TreeNode* Convert2(TreeNode* pRootTree){
	if (NULL == pRootTree)
		return NULL;

	TreeNode*head, *pre = NULL;  //pre记录上一次出栈值
	stack<TreeNode*> ss;
	while (pRootTree || !ss.empty())
	{
		while (pRootTree)
		{
			ss.push(pRootTree);
			pRootTree = pRootTree->left;
		}

		if (!ss.empty()){
			pRootTree = ss.top();
			ss.pop();

			if (pre != NULL){
				pre->right = pRootTree;
				pRootTree->left = pre;
			}else //pre为空,表示ss第一次出栈,为最左值
				head = pRootTree;

			pre = pRootTree;
			pRootTree = pRootTree->right;
		}
	}
	return head;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值