【面试题】二叉搜索树转换双向链表

题目描述

输入一棵二叉搜索树,现在要将该二叉搜索树转换成一个排序的双向链表。而且在转换的过程中,不能创建任何新的结点,只能调整树中的结点指针的指向来实现。
这里写图片描述
二叉搜索树,左子结点的值总是小于父结点的值,右子结点的值总是大于父结点的值。

解题思路

如果用中序遍历二叉搜索树,遍历结点的顺序就是从小到大。所以这题的基本思路就是:用中序遍历一下二叉树,同时保留当前链表的最后一个指针pLast,以及当前指针pCurrent,每访问一个节点更新一下两者的值。
这里写图片描述

代码实现

#include <iostream>
#include <stdlib.h>
#include <time.h>

using namespace std;

typedef struct TreeNode
{
    int data;
    TreeNode *Leftchild;
    TreeNode *Rightchild;
}TreeNode, *PtreeNode;


PtreeNode InsertSortTree(PtreeNode Tree, int data)
{
    if(Tree == NULL)
    {
        Tree = new TreeNode;
        Tree->data = data;
        Tree->Leftchild = NULL;
        Tree->Rightchild = NULL;
    }

    if(Tree->data > data)
        Tree->Leftchild = InsertSortTree(Tree->Leftchild, data);

    if(Tree->data < data)
        Tree->Rightchild = InsertSortTree(Tree->Rightchild, data);

    return Tree;
}

PtreeNode CreatSortTree(PtreeNode Tree)
{
    srand(time(NULL));
    cout << "generate 10 rand num" << endl;
    for(int i = 0; i < 10; i ++)
    {
        int data = rand()%100 + 1;
        cout << data << " ";
        Tree = InsertSortTree(Tree, data);
    }
    cout << endl;
    return Tree;
}

void PreOrderTraverse(PtreeNode Tree)
{
    if(Tree == NULL)
        return;
    PreOrderTraverse(Tree->Leftchild);
    cout << Tree->data << " ";
    PreOrderTraverse(Tree->Rightchild);
}

void CoverToList(PtreeNode Tree, PtreeNode *lastNode)
{
    if(Tree == NULL)
        return;

    PtreeNode pCurrent = Tree;

    if(pCurrent->Leftchild != NULL)
        CoverToList(pCurrent->Leftchild, lastNode);

    pCurrent->Leftchild = *lastNode;
    if((*lastNode) != NULL)
        (*lastNode)->Rightchild = pCurrent;

    *lastNode = pCurrent;

    if(pCurrent->Rightchild != NULL)
        CoverToList(pCurrent->Rightchild, lastNode);
}

PtreeNode Cover(PtreeNode Tree)
{
    PtreeNode lastNode = NULL;
    CoverToList(Tree, &lastNode);

    PtreeNode pHeadList = lastNode;

    while(pHeadList != NULL && pHeadList->Leftchild != NULL)
        pHeadList = pHeadList->Leftchild;
    return pHeadList;
}

void Print_Tree(PtreeNode Tree)
{
    cout << "Sort Tree is :" << endl;
    PreOrderTraverse(Tree);
}

void Print_List(PtreeNode List)
{
    cout << "Cover to List is :" << endl;
    while(List != NULL)
    {
        cout << List->data << " ";
        List = List->Rightchild;
    }
    cout << endl;
}

int main(int argc, char const *argv[])
{
    PtreeNode Tree = NULL;
    Tree = CreatSortTree(Tree);

    Print_Tree(Tree);

    Tree = Cover(Tree);

    Print_List(Tree);

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值