二叉搜索树与双向链表

题目1503:二叉搜索树与双向链表

时间限制:1 秒

内存限制:128 兆

特殊判题:

提交:963

解决:259

题目描述:

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。

输入:

输入可能包含多个测试样例。
对于每个测试案例,输入的第一行为一个数n(0<n<1000),代表测试样例的个数。
接下来的n行,每行为一个二叉搜索树的先序遍历序列,其中左右子树若为空则用0代替。

输出:

对应每个测试案例,
输出将二叉搜索树转换成排序的双向链表后,从链表头至链表尾的遍历结果。

样例输入:
1
2 1 0 0 3 0 0
样例输出:
1 2 3
#include <iostream>
using namespace std;
struct Node
{
    int val;
    Node *left;
    Node *right;
    Node(int data):val(data),left(NULL),right(NULL){}//构造函数没有返回类型
};
Node * CreatTree(Node *pRoot)
{
    int val;
    cin>>val;
    if(val!=0)
    {
        pRoot=new Node(val);
        pRoot->left=CreatTree(pRoot->left);
        pRoot->right=CreatTree(pRoot->right);
    }
    return pRoot;
}
void ConvertNode(Node *pNode,Node **pTemp)//左孩子*left指向前驱,右孩子*right指向后继。pTemp一直延续下去,注意用二级指正
{
    if(NULL==pNode)
        return;
    Node *pCur=pNode;
    if(pCur->left!=NULL)
        ConvertNode(pCur->left,pTemp);//
    pCur->left=*pTemp;
    if(*pTemp!=NULL)
        (*pTemp)->right=pCur;
    *pTemp=pCur;
    if(pCur->right!=NULL)
        ConvertNode(pCur->right,pTemp);
}
Node * Convert(Node *pNode)
{
     
    Node *pLast=NULL;
    ConvertNode(pNode,&pLast);
    Node *pHead=pLast;
    while(pHead->left!=NULL&&pHead!=NULL)
        pHead=pHead->left;
    return pHead;
}
void PrintList(Node *pRoot)
{
    if(pRoot==NULL)
        return;
    Node *pHead=pRoot;
    while(pHead!=NULL)
    {
        cout<<pHead->val<<" ";
        pHead=pHead->right;
    }
}
int main()
{
    int n;
    while(cin>>n)
    {
        for(int i=0;i<n;i++)
        {
            Node *pRoot=NULL;
            Node *pTemp=NULL;
            Node *pHeadOfList;
            pRoot=CreatTree(pRoot);         
            pHeadOfList=Convert(pRoot);
            PrintList(pHeadOfList);
            cout<<"\n";  
        }
    }
    return 0;
}
/**************************************************************
    Problem: 1503
    User: road
    Language: C++
    Result: Accepted
    Time:140 ms
    Memory:2312 kb
****************************************************************/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值