您的位置:首页 > 职场人生

面试题27:二叉搜索树转换为有序双向链表

2015-06-01 17:47 519 查看
题目:输入一棵二叉搜索树,现在要将该二叉搜索树转换成一个排序的双向链表。而且在转换的过程中,不能创建任何新的结点,只能调整树中的结点指针的指向来实现。

思路:设置一个指针,用来指向链表的尾结点,初始化为NULL,中序遍历二叉树,先遍历左子树,找到第一个结点,它的左结点为空,将这个结点的左结点指针指向链表的尾结点,将链表尾结点的右指针指向当前结点,修改尾结点指针让它继续指向尾结点,然后判断它的右结点。

#include <iostream>
using namespace std;

struct BinaryTreeNode
{
int              m_nValue;
BinaryTreeNode * m_pLeft;
BinaryTreeNode * m_pRight;
};

BinaryTreeNode * Convert(BinaryTreeNode * pRoot)
{
//链表的尾指针
BinaryTreeNode * pLastNodeOfList=NULL;
ConvertNode(pRoot,&pLastNodeOfList);
//寻找头结点
BinaryTreeNode * pHead=pLastNodeOfList;
while(pHead!=NULL&&pHead->m_pLeft!=NULL)
{
pHead=pHead->m_pLeft;
}
return pHead;

}

void ConvertNode(BinaryTreeNode * pNode,BinaryTreeNode * * pLastNodeOfList)
{
if(pNode==NULL)
return;

BinaryTreeNode * pCurrentNode=pNode;//当前结点
//遍历左子树
if(pCurrentNode->m_pLeft!=NULL)
{
ConvertNode(pCurrentNode->m_pLeft,pLastNodeOfList);
}

//将当前结点的左结点指向链表的尾结点
pCurrentNode->m_pLeft=*pLastNodeOfList;
//如果链表尾结点不为空,将尾结点的右指针指向当前结点
if(*pLastNodeOfList!=NULL)
{
(*pLastNodeOfList)->m_pRight=pCurrentNode;
}
//将当前结点设为尾结点
*pLastNodeOfList=pCurrentNode;

//遍历右子树
if(pCurrentNode->m_pRight!=NULL)
{
ConvertNode(pCurrentNode->m_pRight,pLastNodeOfList);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: