27-二叉搜索树转换成排序的双向链表

一、问题描述

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表,要求不能创建任何新的结点,
只能调整树中结点指针的指向。比如输入下图的二叉搜索树,则输出转换之后的排序双向链表为:
       10
     /    \
    6     14
   / \   /  \
  4   8 12  16

NULL <- 4 <-> 6 <-> 8 <-> 10 <-> 12 <-> 14 <-> 16

二、解题思路

二叉搜索树就是二叉排序树,它的中序遍历就是从小到大排好序的,当前结点current_node的前一个结点就是current_node->left,后一个结点就是current_node->right因此,本题的难点在于正确地修改指针指向。算法用current_node指针指向当前结点,next_node指向从小到大排序后当前结点的下一个结点

三、解题算法

/**************************************************************
Author:tmw
date:2018-7-2
**************************************************************/
#include <stdio.h>
#include <stdlib.h>

typedef struct BiTreeNode
{
    int data;
    struct BiTreeNode* lchild;
    struct BiTreeNode* rchild;
}BiTreeNode;

/**
* 输出转换成排序双向链表的结果
* @param BiTreeNode* root
*/
BiTreeNode* return_changeBST2_dLinkList( BiTreeNode* root )
{
    if( root == NULL ) return NULL;

    BiTreeNode* next_node = NULL;
    /**实现将root搜索二叉树转换成排序双向链表**/
    ChangeBST_2_dLinkList( root, next_node );

    /**找到头结点并返回**/
    BiTreeNode* head_node = next_node; //转换完后,next_node指向双向链表最后一个结点
    while( head_node->lchild != NULL )
        head_node = head_node->lchild; //往前找

    return head_node;
}

/**
* 实现将二叉搜索树转换成排序的双向链表
* @param BiTreeNode* root
* @param BiTreeNode* next_node  -- 转换成功后 next_node指向表尾结点
*/
void ChangeBST_2_dLinkList( BiTreeNode* root, BiTreeNode* next_node )
{
    /**递归回退条件**/
    if( root == NULL ) return;

    /**左**/
    BiTreeNode* current_node = root;/**初始:current_node指向根节点**/
    if( current_node->lchild != NULL )
        ChangeBST_2_dLinkList(current_node->lchild,next_node);

    /**中**/
    current_node->lchild = next_node;/**找到前一个结点**/
    if( next_node != NULL )
        next_node->rchild = current_node; /**前一个结点指向当前结点**/

    next_node = current_node;/**局部转换好,后挪一位**/

    /**右**/
    if( current_node->rchild != NULL )
        ChangeBST_2_dLinkList(current_node->rchild,next_node);
}


梦想还是要有的,万一实现了呢~~~ヾ(◍°∇°◍)ノ゙~~~~

猜你喜欢

转载自blog.csdn.net/qiki_tangmingwei/article/details/80891202