一、问题描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表,要求不能创建任何新的结点,
只能调整树中结点指针的指向。比如输入下图的二叉搜索树,则输出转换之后的排序双向链表为:
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);
}
梦想还是要有的,万一实现了呢~~~ヾ(◍°∇°◍)ノ゙~~~~