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

来源:互联网 发布:淘宝 访问受限 编辑:程序博客网 时间:2024/05/21 15:01

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


思路:设置一个指针,用来指向链表的尾结点,初始化为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);}}


0 0