微软面试100题

参看http://blog.csdn.net/v_JULY_v/article/details/6057286

算是学习笔记

1把二元查找树转变成排序的双向链表(树)
 题目:
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
   10
  / /
  6  14
 / / / /
4  8 12 16
 转换成双向链表
4=6=8=10=12=14=16。

#include<iostream>
using namespace std;
typedef struct Node
{
    struct Node *lchild;
    struct Node *rchild;
    int data;
}Node,*pNode,*pTree;
pNode createNode(int data)
{
    pNode ret = (pNode)malloc(sizeof(Node));
    ret->lchild=NULL;
    ret->rchild=NULL;
    ret->data=data;
    return ret;
}
void print(pTree p)
{
    if(p==NULL)
        return;
    print(p->lchild);
    cout<<p->data<<"left :";
    if(p->lchild!=NULL)
    cout<<p->lchild->data<<" ";
    cout<<"right: ";
    if(p->rchild!=NULL)
    cout<<p->rchild->data<<" ";
    cout<<endl;
    print(p->rchild);
}
void ChangeToList(pTree p)
{
    if(p==NULL)
        return ;
    pTree child=p->lchild;
    if(child != NULL)
    {
        ChangeToList(child);
        while(child->rchild!=NULL)
            child=child->rchild;
        child->rchild=p;
        p->lchild=child;
    }

    child =p->rchild;
    if(child!=NULL)
    {
        ChangeToList(child);
        while(child->lchild!=NULL)
            child=child->lchild;
            child->lchild=p;
            p->rchild=child;
    }

}
int main(void)
{
    pTree tree= createNode(10);
    pNode tem=createNode(6);
    tree->lchild=tem;
    tem->lchild=createNode(4);
    tem->rchild=createNode(8);
    tem= createNode(14);
    tree->rchild=tem;
    tem->lchild=createNode(12);
    tem->rchild=createNode(16);
    print(tree);
    ChangeToList(tree);
    while(tree->lchild!=NULL)
        tree=tree->lchild;
    while(tree->rchild!=NULL)
    {
        cout<<" "<<tree->data;
        cout<<" lchlid : ";
        if(tree->lchild !=NULL)
            cout<<tree->lchild->data;
        cout<<" rchild : ";
         if(tree->rchild!=NULL)
        cout<< tree->rchild->data;
        cout<<endl;
        tree=tree->rchild;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值