码迷,mamicode.com
首页 > 其他好文 > 详细

二叉搜索树与双向链表

时间:2015-05-26 00:22:39      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:c++   刷题   

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

二叉树结点的定义如下:

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);
}


二叉搜索树与双向链表

标签:c++   刷题   

原文地址:http://blog.csdn.net/lsh_2013/article/details/45989975

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!