[程序员面试题精选100题]1.把二叉查找树转变成排序的双向链表

本文主要是介绍[程序员面试题精选100题]1.把二叉查找树转变成排序的双向链表,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【题目】

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

比如将二叉查找树
                                            10
                                          /    \
                                        6       14
                                      /  \     /  \
                                         4     8  12    16
转换成双向链表4=6=8=10=12=14=16


参考:程序员面试题精选100题(01)-把二元查找树转变成排序的双向链表

【思路】

本题是微软的面试题。很多与树相关的题目都是用递归的思路来解决,本题也不例外。

我们可以中序遍历整棵树。按照这个方式遍历树,比较小的结点先访问。如果我们每访问一个结点,假设之前访问过的结点已经调整成一个排序双向链表,

我们再把调整当前结点的指针将其链接到链表的末尾。当所有结点都访问过之后,整棵树也就转换成一个排序双向链表了。

【代码】

/*********************************
*   日期:2013-12-17
*   作者:SJF0115
*   题目: 把二元查找树转变成排序的双向链表
*   来源:微软
*   分类:经典面试题
**********************************/
#include <iostream>
using namespace std;struct TreeNode{int val;TreeNode *left;TreeNode *right;TreeNode(int x):val(x),left(NULL),right(NULL){}
};
//中序遍历过程中改变
// 转换后pre指向双向链表的最后一个节点
// root成为中间节点
void ConvertDoubleList(TreeNode* root, TreeNode*& pre) {if(root == NULL){return;}// 当前节点TreeNode* cur = root;// 左子节点if(cur->left){ConvertDoubleList(cur->left,pre);}// 中间节点 改成双向链表cur->left = pre;if(pre != NULL){pre->right = cur;}//if// 前一节点pre = cur;// 右子节点if(cur->right){ConvertDoubleList(cur->right,pre);}//if
}
// 二叉查找树插入
void TreeInsert(TreeNode*& root,int val){// 创建新节点TreeNode* node = new TreeNode(val);if(root == NULL){root = node;}else{TreeNode *pre = NULL;TreeNode *cur = root;// 寻找插入位置while(cur){// 父节点pre = cur;// 沿左子树方向下降if(val < cur->val){cur = cur->left;}// 沿右子树方向下降else{cur = cur->right;}}//while// 插入左子结点处if(val < pre->val){pre->left = node;}// 插入右子结点处else{pre->right = node;}//if}//if
}// 中序遍历
void InOrder(TreeNode* root){if(root == NULL){return;}if(root->left){InOrder(root->left);}cout<<root->val<<endl;if(root->right){InOrder(root->right);}
}
//输出双向链表
void PrintDoubleList(TreeNode *head){TreeNode *cur = head;if(cur == NULL){return;}// 反向遍历while(cur->left){cout<<cur->val<<"->";cur = cur->left;}cout<<cur->val<<"->NULL"<<endl;// 正向遍历while(cur){cout<<cur->val<<"->";cur = cur->right;}cout<<"NULL"<<endl;
}int main(){int array[] = {10,6,14,4,8,12,16};// 创建二叉查找树TreeNode *root = NULL;for(int i = 0;i < 7;i++){TreeInsert(root,array[i]);}// 中序遍历// InOrder(root);// 二叉查找树转换为双向链表TreeNode *pre = NULL;ConvertDoubleList(root,pre);// 打印双向链表PrintDoubleList(pre);return 0;
}







这篇关于[程序员面试题精选100题]1.把二叉查找树转变成排序的双向链表的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/723261

相关文章

Python按照24个实用大方向精选的上千种工具库汇总整理

《Python按照24个实用大方向精选的上千种工具库汇总整理》本文整理了Python生态中近千个库,涵盖数据处理、图像处理、网络开发、Web框架、人工智能、科学计算、GUI工具、测试框架、环境管理等多... 目录1、数据处理文本处理特殊文本处理html/XML 解析文件处理配置文件处理文档相关日志管理日期和

精选20个好玩又实用的的Python实战项目(有图文代码)

《精选20个好玩又实用的的Python实战项目(有图文代码)》文章介绍了20个实用Python项目,涵盖游戏开发、工具应用、图像处理、机器学习等,使用Tkinter、PIL、OpenCV、Kivy等库... 目录① 猜字游戏② 闹钟③ 骰子模拟器④ 二维码⑤ 语言检测⑥ 加密和解密⑦ URL缩短⑧ 音乐播放

MySQL中查找重复值的实现

《MySQL中查找重复值的实现》查找重复值是一项常见需求,比如在数据清理、数据分析、数据质量检查等场景下,我们常常需要找出表中某列或多列的重复值,具有一定的参考价值,感兴趣的可以了解一下... 目录技术背景实现步骤方法一:使用GROUP BY和HAVING子句方法二:仅返回重复值方法三:返回完整记录方法四:

C++链表的虚拟头节点实现细节及注意事项

《C++链表的虚拟头节点实现细节及注意事项》虚拟头节点是链表操作中极为实用的设计技巧,它通过在链表真实头部前添加一个特殊节点,有效简化边界条件处理,:本文主要介绍C++链表的虚拟头节点实现细节及注... 目录C++链表虚拟头节点(Dummy Head)一、虚拟头节点的本质与核心作用1. 定义2. 核心价值二

一文详解Java Stream的sorted自定义排序

《一文详解JavaStream的sorted自定义排序》Javastream中的sorted方法是用于对流中的元素进行排序的方法,它可以接受一个comparator参数,用于指定排序规则,sorte... 目录一、sorted 操作的基础原理二、自定义排序的实现方式1. Comparator 接口的 Lam

C++作用域和标识符查找规则详解

《C++作用域和标识符查找规则详解》在C++中,作用域(Scope)和标识符查找(IdentifierLookup)是理解代码行为的重要概念,本文将详细介绍这些规则,并通过实例来说明它们的工作原理,需... 目录作用域标识符查找规则1. 普通查找(Ordinary Lookup)2. 限定查找(Qualif

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与

Java List排序实例代码详解

《JavaList排序实例代码详解》:本文主要介绍JavaList排序的相关资料,Java排序方法包括自然排序、自定义排序、Lambda简化及多条件排序,实现灵活且代码简洁,文中通过代码介绍的... 目录一、自然排序二、自定义排序规则三、使用 Lambda 表达式简化 Comparator四、多条件排序五、

JAVA数组中五种常见排序方法整理汇总

《JAVA数组中五种常见排序方法整理汇总》本文给大家分享五种常用的Java数组排序方法整理,每种方法结合示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录前言:法一:Arrays.sort()法二:冒泡排序法三:选择排序法四:反转排序法五:直接插入排序前言:几种常用的Java数组排序

C#实现查找并删除PDF中的空白页面

《C#实现查找并删除PDF中的空白页面》PDF文件中的空白页并不少见,因为它们有可能是作者有意留下的,也有可能是在处理文档时不小心添加的,下面我们来看看如何使用Spire.PDFfor.NET通过C#... 目录安装 Spire.PDF for .NETC# 查找并删除 PDF 文档中的空白页C# 添加与删