剑指offer之二叉搜索树和双向链表

1 问题

比如我们搜索二叉树如下,我们需要变成双向链表
 

 

 

 

 

 

 

2 分析

我们知道这个变成双向链接的时候是按照树的中序遍历打印的,我们只需要在中序遍历打印的时候操作该节点,我们可以用临时变量保存这个节点,同时我们也需要单独增加一个链表节点变量,我们需要保证这个节点的左边指向是该链表节点,然后该链表节点的右指向是这个节点,然后我们再把这个节点赋值给这个链表节点,就这样一直移动下去即可。

 

 

 

 

 

3 代码实现

我这里以下面的搜索二叉树进行操作的

42         61     3   5     7     
#include <stdio.h>
#include <stdlib.h>typedef struct Tree
{int value;struct Tree* left;struct Tree* right;
} Tree;/** 把搜索二叉树转成双向链表,我们按照中序遍历*/
void convertNode(Tree* node, Tree** lastNodeList)
{if (node == NULL)return;Tree* pCurrent = node;if (pCurrent->left != NULL){convertNode(pCurrent->left, lastNodeList);}//这里就要进行我们每个节点的前后正确的指向了pCurrent->left = *lastNodeList;if (*lastNodeList != NULL){(*lastNodeList)->right = pCurrent;}*lastNodeList = pCurrent;if (pCurrent->right != NULL){convertNode(pCurrent->right, lastNodeList);}
}/** 把翻转好的双向链表尾巴节点移动到链表头*/
Tree* convert(Tree* node, Tree* lastNodeList)
{if (node == NULL || lastNodeList == NULL){printf("node is NULL or lastNodeList is NULL\n");return NULL;}Tree* last = NULL;convertNode(node, &lastNodeList);//因为这个时候lastNodeList已经到了双向链表尾巴,我们需要移动到链表头Tree* headNodeList = lastNodeList;while (headNodeList != NULL && headNodeList->left != NULL){headNodeList = headNodeList -> left;} return headNodeList;
}/** 双向链表从左到右打印*/
void printRightList(Tree* headNodeList)
{if (headNodeList == NULL){printf("headNodeList is NULL\n");return;}printf("we will print list from left to right\n");Tree* pCurrent = headNodeList;while (pCurrent != NULL){printf("value is %d\n", pCurrent->value);pCurrent = pCurrent->right;}
}/** 双向链表从右到左打印*/
void printLeftList(Tree* headNodeList)
{if (headNodeList == NULL){printf("headNodeList is NULL\n");return;}printf("we will print list from right to left\n");Tree* pCurrent = headNodeList;//先把链表头结点移动为链表的尾巴while (pCurrent->right != NULL){//printf("value is %d\n", pCurrent->value);pCurrent = pCurrent->right;}//pCurrent = pCurrent->left;while (pCurrent != NULL){printf("value is %d\n", pCurrent->value);pCurrent = pCurrent->left;} 
}int main(void) 
{Tree *node1 , *node2 , *node3, *node4, *node5, *node6, *node7;node1 = (Tree *)malloc(sizeof(Tree));node2 = (Tree *)malloc(sizeof(Tree));node3 = (Tree *)malloc(sizeof(Tree));node4 = (Tree *)malloc(sizeof(Tree));node5 = (Tree *)malloc(sizeof(Tree));node6 = (Tree *)malloc(sizeof(Tree));node7 = (Tree *)malloc(sizeof(Tree)); node1->value = 4;node2->value = 2;node3->value = 6;node4->value = 1;node5->value = 3;node6->value = 5;node7->value = 7;node1->left = node2;node1->right = node3;node2->left = node4;node2->right = node5;node3->left = node6;node3->right = node7;node4->left = NULL;node4->right = NULL;node5->left = NULL;node5->right = NULL;node6->left = NULL;node6->right = NULL;node7->left = NULL;node7->right = NULL;Tree* list = (Tree *)malloc(sizeof(Tree));if (!list){printf("malloc list fail\n");return -1;}Tree* firstNodeList = NULL;//convertNode(node1, &list);firstNodeList = convert(node1, list);if (firstNodeList == NULL){printf("firstNodeList is NULL\n");return -1;}printRightList(firstNodeList);printLeftList(firstNodeList);return 0;
}

 

 

 

 

4 运行结果

we will print list from left to right
value is 0
value is 1
value is 2
value is 3
value is 4
value is 5
value is 6
value is 7
we will print list from right to left
value is 7
value is 6
value is 5
value is 4
value is 3
value is 2
value is 1
value is 0

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/288089.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

text 热敏打印机_只要有想象力,打印机都能做游戏

不知道为什么&#xff0c;文本冒险游戏最近频频被人提及。这不&#xff0c;现在又出来一个基于实时打印的文本冒险游戏 —— Quest Smith。这位脑洞较大的创客名叫 Bekir Dağ &#xff0c;他用微型打印机和树莓派做出了这个手持游戏设备。关于文本冒险游戏的背景知识&#xff…

C#内建接口:IConvertible

这节来讲一个比较有意思的接口&#xff1a;IConvertible。IConvertible接口处于System.Runtime命名空间下&#xff0c;这个接口规定了一批ToXxx()方法&#xff0c;凡是实现了这个接口的方法&#xff0c;我们都可以尝试将其转换为自己想要的类型。IConvertible中有什么&#xff…

ArcGIS升级地理数据库

本博文教大家如何快速地将低版本地理数据库升级为高版本地理数据库。 方法一&#xff1a;使用“升级地理数据库”工具箱二、使用ArcCatalog地理数据库→右键→属性。三、创建不同版本的地理数据库

汉高软件服务器安装系统,如何安装了如指掌眼镜管理系统的服务器和客户端,还需要安装什么软件的?...

满意答案ven85202014.05.09采纳率&#xff1a;53% 等级&#xff1a;7已帮助&#xff1a;356人易软眼镜店管理系统它整合了整个眼镜店的收费、客户登记、验光单管理、配镜管理、财务管理和查旬报表以及库存管理一体化的管理系统。随时可以查看客户的验光单、对比&#xff0c;…

Python3 实现单例设计模式

单例模式的一般实现 饿汉式 懒汉式就是通过一个方法才能实现单例&#xff0c;我不是很常用&#xff0c;所以在此就写个饿汉式。以后再补懒汉式。 单例模式的核心作用是保证一个类只有一个该类型的对象。在一个对象被过多调用时避免过多的消耗内存&#xff0c;即可使用单例模式…

基于casbin的ABAC/RBAC权限实践

五一假期疫情封在家也没事做&#xff0c;就想来优化一下一个前端容器小项目之前的TODOlist里面有一项是权限这块时隔2年了还一直没有动手迟迟没搞主要还是我太懒了&#xff0c;哈哈 其实我一直想要找一个轻量级的权限通用方案权限的数据源可以切换&#xff0c;但是逻辑基本不用…

Python3 实现建造者模式

建造者模式 建造者模式用于创建复杂的对象。使用建造者模式可以使复杂的过程层次明了、清晰&#xff0c;把对象的创建以及使用进行了解耦。实际上从代码的角度上看&#xff0c;是进行了多次封装&#xff0c;使代码结构更为规范合理&#xff0c;层次结构更加鲜明。 在一个复杂…

系列网络服务器机柜,什么是网络机柜 网络机柜和服务器机柜有哪些区别【详解】...

【网络机柜】什么是网络机柜 网络机柜和服务器机柜区别服务器机柜和网络机柜的区别服务器机柜 &#xff1a;用来组合安装面板、插件、插箱、电子元件、器件和机械零件与部件&#xff0c;使其构成一个整体的安装箱。可以配置&#xff1a;专用固定托盘、专用滑动托盘、电源插排、…

【3D Max】3D max如何删除环境贴图

问题描述&#xff1a;在用3dm max贴图的时候&#xff0c;如果不选中对象&#xff0c;很容易将图贴到背景环境中去&#xff0c;情况如下所示&#xff1a; 解决办法有二&#xff1a; 一、不参与渲染 快捷键8&#xff0c;在“环境和效果”窗口中去掉“使用贴图”前面的√。 二、…

C#语法糖系列 —— 第四篇:聊聊 Span 的底层玩法

把 Span 归于语法糖&#xff0c;可能有些偏了&#xff0c;但偏了就偏了&#xff0c;哈哈&#xff0c;只要是分享就好&#xff0c;C# 发展至今&#xff0c;已经是一门非常重的语言了&#xff0c;所有想要的它都要&#xff0c;即可以&#xff1a;面向过程编程面向对象编程面向函数…

【ArcGIS风暴】河流水系左斜体样式经典设置方法

目录 一、效果预览 二、实现方法 一、效果预览 河流水系在作图时一般设置为左斜体、蓝色,如黄河、青海湖、洮河等,如下图所示: 二、实现方法 下面介绍在ArcGIS 10.5中的实现方法。 1、ArcGIS设置方法 绘图工具添加文字或者将标注转为注记,双击,打开属性,点击更改符号…

HBase简介(很好的梳理资料)

HBase HBaseHadoop网络应用数据结构NoSQL 一、 简介 history started by chad walters and jim 2006.11 G release paper on BigTable 2007.2 inital HBase prototype created as Hadoop contrib 2007.10 First useable Hbase 2008.1 Hadoop become Apache top-level project …

python 实现原型设计模式

原型设计模式主要在当新建一个对象的时候&#xff0c;觉得很麻烦&#xff0c;并且你又要保留当前对象。在这种情况下使用原型设计模式是一个很好的解决办法。 例如你写一个东西更新&#xff0c;不同的版本&#xff0c;这个时候以前的版本肯定要保留&#xff0c;并且从此基础上…

装服务器显示磁盘脱机,服务器磁盘处于脱机

服务器磁盘处于脱机 内容精选换一换配置目的端或启动目的端时提示“SMS.1311 目的端磁盘个数不够”。在配置目的端服务器过程中&#xff0c;会校验目的端磁盘数量是否和源端一致。当出现该错误时&#xff0c;检查目的端服务器磁盘数量是否少于源端服务器磁盘数量&#xff0c;或…

剑指offer之重建二叉树

1 问题 重建二叉树&#xff1a;给定二叉树的先序遍历&#xff08;根左右&#xff09;和中序&#xff08;左中右&#xff09;遍历结果&#xff0c;建立这棵二叉树。输入保证二叉树无重复结点 以先序{1, 2, 4, 7, 3, 5, 6, 8}和中序{4, 7, 2, 1, 5, 3, 8, 6}为例 2 分析 先序遍…

ArcGIS 10.5专题地图制作自定义漂亮图框

先来看一下效果: 下面来说明如何在ArcGIS软件里面实现自定义图框。 1. 【自定义】→【样式管理器】→【Administrator.style】→【边框】→【新建】→【常规边框】。 2. 点击【更改符号】。 3. 点击【编辑符号】。

当我会AOP之后,去丈母娘家都是挺着胸脯!

当和朋友谈到AOP时&#xff0c;第一映像会说AOP的应用层面&#xff0c;比如拦截器、过滤器&#xff0c;实现复用等等使用层面上。这些应用层面上的回答远远没有深入AOP的思想。是的&#xff0c;AOP是思想&#xff0c;面向切面思想。既然是编程思想&#xff0c;那我们就有必要了…

python 最简单的实现适配器设计模式

适配器设计模式是懒得改动某些代码&#xff0c;或者某些接口不方便改动的时候&#xff0c;使用一个特定的封装&#xff0c;一些特定的编写办法&#xff0c;使不同的接口可以使用同种调用方式使用。 更简单的说话则是&#xff0c;例如几个不同的接口 aliyun、qiniuyun、tencent…

Envi和ArcGIS软件打开和处理.NC4数据

NC4是NetCDF-4的简缩形式。 NetCDF(network Common Data Form)网络通用数据格式是由美国大学大气研究协会(University Corporation for Atmospheric Research,UCAR)的Unidata项目科学家针对科学数据的特点开发的,是一种面向数组型并适于网络共享的数据的描述和编码标准。目…

C#多线程调试

概要这篇文章主要分享多线程部分调试技巧&#xff0c;在日常的开发工作中会经常遇到多线程调试的需要。在我们调试的过程中会出现断点的焦点在多个线程之间“反复横跳”根本无法集中跟踪某一个线程的操作链路。那么今天我们来看看如何调试操作。如果有其它需要的可以参考下面微…