二叉搜索树转化为双向链表

整个过程可以看做是三部分的链表化,左子树、根节点和右子树。

递归地对这三部分进行链表化,在链表化中处理好左子树最右节点与根节点的链接关系、根节点与右子树的关系,那么整个过程就能够完成。

 

代码

 

TreeNode * convert(TreeNode * root)
{
    TreeNode *LastNodeInList = NULL;
    convertNode(root,&LastNodeInList);
   
    TreeNode ListHead = LastNodeInlist;
    while(ListHead != NULL && ListHead->left != NULL)

    {

        ListHead = ListHead->left;

     }

     return ListHead;
}

 

void convertNode(TreeNode * node, TreeNode = LastNodeInList)

{

    if(node == NULL) return ;

    TreeNode * current = node; //记住,此时node 与current相当

    if(current->left != NULL)

        convertNode(current->letf,LastNodeInList); //递归地调用此函数进行链表修改

    current->left = LastNodeInList; //修改指针 current指向前一部分的最右(最大元素)

    if(LastNodeInList !=NULL)LastNodeInList->right = current;//修改指针,前一部分最右元素指向current

 

    LastNodeInList = current;//左边部分链接完毕,最右元素LastNodeInList为current,

    if(current->right != NULL)

        convertNode(current->right,LastNodeInList);

}

 

总结: 要了解递归,首先得了解递归。

 

posted @ 2013-04-12 17:53  karlthas  阅读(118)  评论(0编辑  收藏  举报