剑指offer-面试题27:二叉搜索树与双向链

来源:互联网 发布:人才市场管理系统java 编辑:程序博客网 时间:2024/06/06 23:58

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

思路:对于二叉搜索树,根结点的左子树都比它小,右子树都比它大,如果按照中序遍历那么结点就是排序的,问题的关键是如何修改指针指向。假设左右子树已经排序,那么只要将左子树的尾结点连接上根结点,根结点连接上右子树就可以了。关于怎么连接左右子树,还是有一点技巧的。我们每次连接完成之后都更新尾结点,因为每次连接都要用到尾结点,把它作为转换函数的一个参数传进去。左子树转换后的尾结点连接根结点,然后根结点作为新的尾结点去连接右子树。左右子树的转换等同于于根结点的转换,因此这是一个递归的过程。

BinaryTreeNode* Convert(BinaryTreeNode* pRoot){    BinaryTreeNode* pLastNodeInList = NULL;    ConvertNode(pRoot, &pLastNodeInList);        BinaryTreeNode* pHeadOfList = pLastNodeInList;    while(pHeadOfList != NULL && pHeadOfList->m_pLeft != NULL)        pHeadOfList = pHeadOfList->m_pLeft;            return pHeadOfList;}ConvertNode(BinaryTreeNode* pNode, BinaryTreeNode** pLastNodeInList){    if(pNode == NULL)        return;            if(pNode->m_pLeft != NULL)        ConvertNode(pNode->m_pLeft, pLastNodeInList);            BinaryTreeNode* pCurrent = pNode;    if(*pLastNodeInList != NULL)        pLastNodeInList->m_pRight = pCurrent;    pCurrent->m_pLeft = *pLastNodeInList;    *pLastNodeInList = pCurrent;        if(pNode->m_pRight != NULL)        ConvertNode(pNode->m_pRight, pLastNodeInList);}

0 0
原创粉丝点击