算法面试100题——1、把二元查找树转变成排序的双向链表

双向循环链表:移位输出26位字母 双向循环链表:移位输出26位字母 实现用户输入一个数使得26个字母的排列发生变化,例如用户输入3,输出结果: -D E F G H I J K L M N O P Q R S T U V W X Y Z A B C 同时支持用户负数输出,例如输入-3,输出结果: -X Y Z A B C D E F G H I J K L M N O P Q R S T U V W 算法: /** * @Author RunXin * @Date 2021/7/14 9:28 * @description */ 阅读详情

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

10
/ \
6 14
/ \ / \
4 8 12 16

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

首先我们定义的二元查找树 节点的数据结构如下:
struct BSTreeNode
{
int m_nValue; // value of node
BSTreeNode *m_pLeft; // left child of node
BSTreeNode *m_pRight; // right child of node
};

/*用途:
**说明:
**算法:
*/

//#define LOCAL
#include <cstdio>
#include <cstdlib>
#include <stack>
using namespace std;

struct BSTreeNode
{
  int m_nValue;
  BSTreeNode *m_pLeft;
  BSTreeNode *m_pRight;
};
typedef BSTreeNode* BST;
BSTreeNode* NewNode();
BSTreeNode* NewNode(int v);
//递归实现
BSTreeNode* ToDLinkList(BST bst);
void Traverse(BST bst, BSTreeNode* &pre);
//显示栈实现 
BSTreeNode* ToDLinkList2(BST bst); 
void TestHead(BSTreeNode* head);
void TestTail(BSTreeNode* tail);
int main()
{
#ifdef LOCAL
    freopen(".in", "r", stdin);
    freopen(".out", "w", stdout);
#endif

    BST bst = NewNode();
    BSTreeNode *n0 = NewNode(10);
    bst->m_pLeft = n0;

    BSTreeNode *n1 = NewNode(6);
    n0->m_pLeft = n1;
    BSTreeNode *n2 = NewNode(14);
    n0->m_pRight = n2;

    BSTreeNode *n3 = NewNode(4);
    n1->m_pLeft = n3;
    BSTreeNode *n4 = NewNode(8);
    n1->m_pRight = n4;

    BSTreeNode *n5 = NewNode(12);
    n2->m_pLeft = n5;
    BSTreeNode *n6 = NewNode(16);
    n2->m_pRight = n6;

    BSTreeNode* tail = bst->m_pLeft;    //测试尾指针 
    while(tail->m_pRight)
        tail = tail->m_pRight;
    BSTreeNode* head;
//  head = ToDLinkList(bst);    //递归实现
    head = ToDLinkList2(bst);   //显示栈实现

    TestHead(head);
    printf("\n");
    TestTail(tail);

    return 0;
}

BSTreeNode* NewNode()
{
    BSTreeNode* pNode = (BSTreeNode*)malloc(sizeof(BSTreeNode));
    pNode->m_pLeft = pNode->m_pRight = NULL;
    return pNode;
}

BSTreeNode* NewNode(int v)
{
    BSTreeNode* pNode = (BSTreeNode*)malloc(sizeof(BSTreeNode));
    pNode->m_nValue = v;
    pNode->m_pLeft = pNode->m_pRight = NULL;
    return pNode;
}

//递归实现
BSTreeNode* ToDLinkList(BST bst)
{
    BSTreeNode* head = bst;
    while(head->m_pLeft)
        head = head->m_pLeft;
    BSTreeNode* pre = NULL;     //当前节点的前一个指针 
    Traverse(bst->m_pLeft, pre);
    return head;
}

void Traverse(BST bst, BSTreeNode* &pre)
{
    if(bst != NULL){
        Traverse(bst->m_pLeft, pre);

        bst->m_pLeft = pre;
        if(pre)
            pre->m_pRight = bst;

        pre = bst;
        Traverse(bst->m_pRight, pre);
    }
}

//显示栈实现
BSTreeNode* ToDLinkList2(BST bst)
{
    stack<BSTreeNode*> s;
    BSTreeNode* head = bst;
    while(head->m_pLeft)
        head = head->m_pLeft;

    BSTreeNode* pre = NULL;
    BSTreeNode* p = bst->m_pLeft;
    while(!s.empty() || p){
        if(p){
            s.push(p);
            p = p->m_pLeft;
        }
        else{
            BSTreeNode* m_pTop = s.top();
            s.pop();
            m_pTop->m_pLeft = pre;
            if(pre)
                pre->m_pRight = m_pTop;

            pre = m_pTop;
            if(m_pTop->m_pRight)
                p = m_pTop->m_pRight;
        }
    }
    return head;
} 

void TestHead(BSTreeNode* head)
{
    while(head){
        printf("%d ", head->m_nValue);
        head = head->m_pRight;
    }
}

void TestTail(BSTreeNode* tail)
{
    while(tail){
        printf("%d ", tail->m_nValue);
        tail = tail->m_pLeft;
    }
}
微软的100道算法面试题(一) 程序员为什么要学数据结构? 在计算机发展的初期,人们使用计算机的主要目的是处理数值计算问题。使用计算机解决具体问题一般需要经过以下几个步骤:首先从具体问题抽象出适当的数学模型,然后设计或选择解此数学模型的算法,接着编写程序并进行调试、测试,直至得到最终的解答。 由于最初涉及的运算对象是简单的整型、实型或布尔型数据,所以程序设计者的主要精力集中于程序设计的技巧上,而无需重视数据结构。随着计算... 阅读详情

相关推荐

EduCoder 计算机网络实验 IP协议分析

第1关:跟踪抓包 任务描述 相关知识 IPV4数据包 截获数据报 分析截获结果 使用git将本地文件推送到远程仓库永久保存 操作要求 任务描述 本关任务:使用 Ping 命令发送数据报,用 Wireshark 截获数据报,分析 IP 数据报的格式,理解 IPV4 地址的编址方法,加深对 IP 协议的理解。 相关知识 为了完成本关任务,你需要掌握: 截获数据报; 简单分析数据包格式。 IPV4数据包 网际协议第 4 版(Internet Protocol version 4

qq_41975868的博客 1万+

双向链表的知识点+例题

当然,在这个代码中,我们要考虑如果只有head的唯一一个节点,那我们可以检查一下,如果head->next==head,则就不尾删。我们学完了顺序表和链表,为了方便学习,我们来比较一下两种表吧~在这个代码中,如果pos是哨兵位,那么此代码相当于尾插。好啦~我们的知识分享就到这里了~以上就是双向链表的知识点啦~10在pos位置前面插入。让我们画个图就理解了。

aig_m_l的博客 293

从零到一:高通QCS6490边缘AI开发板的Linux生态构建与实战避坑指南

本文详细介绍了在高通QCS6490边缘AI开发板上构建Linux生态系统的完整流程,包括开发环境准备、系统镜像构建与烧录、AI运行时环境配置、模型部署优化以及性能调试。重点解析了如何利用Hexagon DSP的高达12 TOPS AI算力,并提供了实战中的避坑指南和性能优化技巧,帮助开发者高效实现边缘AI应用从概念验证到产品落地的全过程。

eee77的博客 770

【基础算法训练】—— 双向链表

双向链表总结

weixin_52621323的博客 921

Lisflood

文献:基于SWMM和LISFLOOD-FP模型的居住区低影响开发模拟评价。问题:多个节点溢流同时,不行,待解决。目录下,cmd命令行。

警警的博客 2663

玩转Matlab-Simscape(初级)-01-从一个简单模型开始学习之旅

本文从初学者的角度分享的关于Matlab simscape 的基础内容,简单分享了Simscape搭建模型,创建子系统,修改定义参数等内容,为将来深入学习和使用simscape做铺垫。

万金油笑匠的博客 6518

“手撕“9道经典链表算法题

在学完单链表(单向不带头不循环)和双向链表(双向带头循环)后我们会发现双向链表虽然结构略微复杂,但实现相同功能时相较于单链表方便了不止一星半点。

ha2042894194的博客 1970

保姆级教程:用Protege 5.5.0从零构建你的第一个知识图谱(附实战案例文件)

本文提供了一份详细的Protege 5.5.0使用指南,从零开始构建知识图谱。通过'中国古代文人关系网'实战案例,涵盖软件安装、本体创建、属性定义、实例填充到高级功能应用的全流程,帮助初学者快速掌握知识建模的核心技能。

weixin_26808205的博客 234

【算法题】记一道实现双向链表添加、删除、反序的算法题

记一次高人指点的数据结构(双向链表)

7zwang的博客 356

倍福ADS通讯协议深度解析——从握手到数据包的完整旅程

本文以工程师视角,通过Wireshark抓包实战,深度解析了倍福ADS通讯协议的完整工作流程。从TCP三次握手建立连接,到拆解AMS/TCP信封、AMS Header地址与命令解析,再到ADS Data读写请求的载荷构成,完整呈现了一次数据通讯的“旅程”。文章重点剖析了协议包格式,并结合实际案例,提供了基于协议分析的故障排查思路,帮助开发者深入理解并精准调试工业自动化系统通讯。

weixin_29231725的博客 151

如何通过插值法计算cell delay?

插值法的公式:Z = A + B * X + C * Y + D * X * Y,其中X为input transition,Y为output load,A、B、C、D为四个参数,Z为delay值。从而得到Z=-0.086176 + 11.5493 * x + 0.65917 * y - 24.859 * x * y,当X=0.014930、Y=0.296311时,得到Z=0.1716ns。从而得到A = 0.08075,B = 3.47539,C = 0.04008,D = 0.01648。

芯冰乐 1076

数据结构面试100题

引言      无私分享造就开源的辉煌。      今是二零一一年十月十三日,明日14日即是本人刚好开博一周年。在一周年之际,特此分享出微软面试全部100题答案的完整版,以作为对本博客所有读者的回馈。      一年之前的10月14日,一个名叫July (头像为手冢国光)的人在一个叫csdn的论坛上开帖分享微软等公司数据结构+算法面试100题,自此,与上千网友一起做,一起思考

hehuanlin123的博客 2万+

QT+Halcon实现螺纹检测

工业上要检测螺丝的内外直径、内外牙距、内外角度,现在比较好用的图像处理库,开源的opencv,收费的有halcon。为了实现螺纹检测,和对比螺纹检测拿个库比较好。分别用opencv和halcon实现了螺纹检测,通过对比发现用halcon实现的效果比较。现在用博客把实现过程记录下来: 1、需要检测的螺纹数据如下: 2、为了实现检测螺丝以上数据,螺纹内径、螺纹外径、螺纹外牙距、螺纹...

专注现代C++实战,从核心语法到高性能编程,助力开发者深入掌握系统级编程精髓。 7050

二元查找树转变成排序的双向链表

一网友对算法感兴趣,不知怎么得到了我的QQ号,加为好友。给我发来了微软面试题100题,让我做一做。我也正好想准备年底找工作的事儿,一举两得,就试试上面题目的难度。     第一道题是把二元查找树转变成排序的双向链表。一开始做这些题,困难还真不少,遇到的第一个问题就是:什么是二元查找树?     二元查找树: 它首先要是一棵二元树,在这基础上它或者是一棵空树;或者是具有下列性质的二元树:

lvmengmeng 804

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【微软100面试题实现】第01题:把二元查找树转变成排序的双向链表

微软100面试题实现:第01题 题源自:http://topic.youkuaiyun.com/u/20101126/10/b4f12a00-6280-492f-b785-cb6835a63dc9.html 1.把二元查找树转变成排序的双向链表 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不能创建任何新的结点,只调整指针的指向。 10 / \

每天进步一点点 721

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

二元查找树转变成排序的双向链表之C#算法实现

此题为July在优快云发布的微软编程面试100题中的第一题,觉得蛮有趣的,今天也拿过来玩玩,July的代码用的是C++实现,可能因为有指针的原因吧,感觉看起来相对比较容易理解整个的实现过程,而我,试着用C#完成这样的功能。 完整的题目如下: 把二元查找树转变成排序的双向链表,要求不能创建任何新的结点,只调整指针的指向。 10 / \ 6 14...

132

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

微软等面试100题筛选答案-1-二元查找树转换成一个排序的双向链表

//输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 //要求不能创建任何新的结点,只调整指针的指向。 #include #include "stdafx.h" #include using namespace std; struct BSTreeNode{ int m_nValue; // value of node BSTreeNode *m_pLeft; /

重回编程之路 923

java构建排序双链表,《微软面试100题 In Java》01.二元查寻树转变成排序的双向链表...

《微软面试100题 In Java》01.二元查找树转变成排序的双向链表大三下学期了,也到了找暑假实习工作的时间了,所以最近准备刷一些面试题,首先我是从July的《微软面试100题系列》开始刷起,刷完这个之后,我会再找一些题继续练习。这些题我都是用java解的。1.把二元查找树转变成排序的双向链表题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针...

weixin_42132598的博客 181

微软等数据结构+算法面试100题全部答案集锦

微软等数据结构+算法面试100题全部答案集锦 作者:July、阿财。 时间:二零一一年十月十三日。 引言      无私分享造就开源的辉煌。      今是二零一一年十月十三日,明日14日即是本人刚好开博一周年。在一周年之际,特此分享出微软面试全部100题答案的完整版,以作为对本博客所有读者的回馈。      一年之前的10月14日,一个名叫July (头像

5775

永久勘误:微软等面试100题答案V0.2版[第1-20题答案]

微软等面试100题答案V0.2版部分答案精选[第1-20题]作者:July 、何海涛等网友---------------------------    开诚布公,接受读者检验    本文,是根据我之前上传的,微软等面试100题,的答案V0.2版[第1-20题答案]的部分答案精选,此后来不断的粗略的看了看,发现这些答案大部分都有可取之处,但存在的小问题还是不少。    所以,特意把之前上传的答案V0

结构之法 算法之道 9万+

算法面试 精选微软经典的算法面试100题(第1-20题)

算法面试 精选微软经典的算法面试100题(第1-20题)

gdfyug的博客 1080

数据结构+算法面试100题

他们决定这么分: 抽签决定自己的号码(1、2、3、4、5) 首先,由1号提出分配方案,然后大家表决,当且仅当超过半数的人同意时, 按照他的方案进行分配,否则将被扔进大海喂鲨鱼 如果1号死后,再由2号提出分配方案,然后剩下的4人进行表决, 当且仅当超过半数的人同意时,按照他的方案进行分配,否则将被扔入大海喂鲨鱼。那就, 连续来几组微软公司的面试题,让你一次爽个够: ====================== 97.第1组微软较简单的算法面试题 1.编写反转字符串的程序,要求优化速度、优化空间。

2301_78102191的博客 2426

微软等公司数据结构+算法面试100题

微软等公司数据结构+算法面试100题(第1-100题)首次完整亮相                          作者:July、2010年12月6日。 更新:现今,这100题的答案已经全部整理出来了,微软面试100题2010年版全部答案集锦:http://blog.youkuaiyun.com/v_july_v/article/details/6870251。 关

心有多远 就能走远 只要你想 2329

【从零单排之微软面试100题系列】01之二叉查找树与双向链表

本题目选自July大神博客系列【微软面试100题】:july大神,该系列我主要用来记录我的学习笔记。 题目描述:把二元查找数转变成排序的双向链表 要求:输入一棵二元查找树,不能创建任何新的节点,只调整指针的指向 分析思路:(本题也见于《剑指offer》的面试题27.) 由于二元查找树左子树全部小于根结点,右子树全部大于根结点,可以采用中序遍历。这样遍历得到的双向链表就是

leiqian2008的专栏 436

把二元查找树转变成排序的双向链表——精选微软经典的算法面试100题中第一题

<br /> <br />1.把二元查找树转变成排序的双向链表<br /> 题目:<br />输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。<br />要求不能创建任何新的结点,只调整指针的指向。<br /> <br />  10<br />  / /<br /> 6 14<br /> / / / /<br />4 8 12 16<br /> <br /> 转换成双向链表<br />4=6=8=10=12=14=16。<br /> <br /> 首先我们定义的二元查找树 节点的数据结构如下:<

wangyangkobe的专栏 1735
上一篇: URAL-1451. Beerhouse Tale
下一篇: 算法面试100题——2.设计包含min函数的栈
EverydayIsLife
博客等级 码龄12年 9粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值