面试题01:二元查找树转变成排序的双向链

目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何
新的结点,只调整指针的指向。
比如将二元查找树

10
/ \
6 14
/ \ / \
4 8 12 16
转换成双向链表
4=6=8=10=12=14=16

#include <iostream>
using namespace std;

struct Node{
    int value;
    Node* left;
    Node* right;
};

//主程序
void Convert(Node* proot,Node* &pLast){
    if(proot==NULL){
        return;
    }

    Node* pNode=proot;

    if(pNode->left!=NULL){
        Convert(pNode->left,pLast);
    }

    pNode->left=pLast;
    if(pLast!=NULL){
        pLast->right=pNode;
    }
    pLast=pNode;

    if(pNode->right!=NULL){
        Convert(pNode->right,pLast);
    }
}

//驱动程序
Node* ConvertToList(Node* proot){
    if(proot==NULL){
        return proot;
    }

    Node* pLastInList=NULL;
    Convert(proot,pLastInList);

    //返回头结点
    Node* pHead=pLastInList;
    while(pHead!=NULL && pHead->left!=NULL){
        pHead=pHead->left;
    }

    return pHead;
}

Node* create(int value,Node* left=NULL,Node* right=NULL){
    Node* pnode=new Node;
    pnode->value=value;
    pnode->left=left;
    pnode->right=right;
    return pnode;
}

//preorder
void PrintTree(Node* root){
    if(root==NULL){
        return;
    }

    cout<<root->value<<ends;
    PrintTree(root->left);
    PrintTree(root->right);
}

void PrintList(Node* head){
    Node* p=head;
    while(p!=NULL){
        cout<<p->value<<ends;
        p=p->right;
    }
}


int main()
{
    Node* d=create(4);
    Node* e=create(8);
    Node* f=create(12);
    Node* g=create(16);

    Node* b=create(6,d,e);
    Node* c=create(14,f,g);
    Node* a=create(10,b,c);

    PrintTree(a);
    cout<<endl;

    Node* head=ConvertToList(a);
    PrintList(head);
    cout<<endl;


    return 0;
}

这里写图片描述

思路二:我们可以中序遍历整棵树。按照这个方式遍历树,比较小的结点先访问。如果我们每访问一个结点,假设之前访问过的结点已经调整成一个排序双向链表,我们再把调整当前结点的指针将其链接到链表的末尾。当所有结点都访问过之后,整棵树也就转换成一个排序双向链表了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值