二叉搜索树与双向链表

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

二叉树结点的定义如下:

struct BinaryTreeNode{
	int m_nValue;
	BinaryTreeNode *m_pLeft;
	BinaryTreeNode *m_pRight;
};
解法如下:
//返回双向链表的头结点
BinaryTreeNode *Convert(BinaryTreeNode *pRoot)
{
	//指向已经装换好的链表的最后一个结点
	BinaryTreeNode *pLast=NULL;
	//转换排序二叉树为双向链表
	ConvertNode(pRoot,&pLast);
	//返回头结点
	BinaryTreeNode *pHeadOfList=pLast;
	while(pHeadOfList!=NULL&&pHeadOfList->m_pLeft!=NULL)
	{
		pHeadOfList=pHeadOfList->m_pLeft;
	}
	return pHeadOfList;
}


//采用中序遍历的方式将二叉树转化为双向链表, *pLastNodeInList指向双向链表的最后一个节点  
void ConvertNode(BinaryTreeNode *pNode, BinaryTreeNode **pLastNodeInList)
{
	if (pNode==NULL)
		return;
	BinaryTreeNode *pCurrent=pNode;
	 //先转化左子树 
	if (pCurrent->m_pLeft!=NULL)
		ConvertNode(pCurrent->m_pLeft,pLastNodeInList);
	 //将双向链表的最后一个节点与根节点连接在一起  
	pCurrent->m_pLeft=*pLastNodeInList;
	if(*pLastNodeInList!=NULL)
		(*pLastNodeInList)->m_pRight=pCurrent;
	*pLastNodeInList=pCurrent;
	  //转换右子树
	if (pCurrent->m_pRight!=NULL)
		ConvertNode(pCurrent->m_pRight,pLastNodeInList);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值