【IT笔试面试题整理】二叉搜索树转换为双向链表
【试题描述】 将二叉搜索树转换为双向链表
对于二叉搜索树,可以将其转换为双向链表,其中,节点的左子树指针在链表中指向前一个节点,右子树指针在链表中指向后一个节点。
思路一:
采用递归思想,对于二叉搜索树,将左、右子树分别转换为双向链表,左子树转换所得链表的头结点即整个树的头结点,左子树转换所得链表的尾节点与根节点相邻;右子树转换所得链表的尾节点即整个树的尾节点,右子树转换所得链表的头结点与根节点相邻。
1 private static Node last; 2 public static Node treeToList(Node tree) 3 { 4 Node head; 5 // 若树为空,返回空 6 if (tree == null) 7 return null; 8 9 // 若无左子树,则该根节点为链表的头结点 10 if (tree.left == null) 11 head = tree; 12 // 若有左子树,递归调用转换函数将左子树转换为双向链表 13 // 左子树转换所得链表的头结点是整个树的头结点 14 // 左子树链表的尾结点与根节点相邻 15 else 16 { 17 head = treeToList(tree.left); 18 tree.left = last; 19 last.right = tree; 20 } 21 //若无右子树,则该根节点为链表的尾结点 22 if (tree.right == null) 23 last = tree; 24 //若有右子树,递归调用转换函数将右子树转换为双向链表 25 //右子树转换所得链表的尾结点是整个树的尾结点 26 //右子树链表的头结点与根节点相邻 27 else 28 { 29 tree.right = treeToList(tree.right); 30 tree.right.left = tree; 31 } 32 return head; 33 34 }
思路二:
我们可以中序遍历整棵树。按照这个方式遍历树,比较小的结点先访问。如果我们每访问一个结点,假设之前访问过的结点已经调整成一个排序双向链表,我们再把调整当前结点的指针将其链接到链表的末尾。当所有结点都访问过之后,整棵树也就转换成一个排序双向链表了。
1 // / 2 // Covert a sub binary-search-tree into a sorted double-linked list 3 // Input: pNode - the head of the sub tree 4 // pLast - the tail of the double-linked list 5 // / 6 private static Node pLast; 7 8 public static void treeToList(Node pNode) 9 { 10 if (pNode == null) 11 return; 12 Node pCurrent = pNode; 13 14 // Convert the left sub-tree 15 if (pCurrent.left != null) 16 treeToList(pCurrent.left); 17 18 // Put the current node into the double-linked list 19 pCurrent.left = pLast; 20 21 if (pLast != null) 22 pLast.right = pCurrent; 23 24 pLast = pCurrent; 25 // Convert the right sub-tree 26 if (pCurrent.right != null) 27 treeToList(pCurrent.right); 28 } 29 30 // / 31 // Covert a binary search tree into a sorted double-linked list 32 // Input: pHead - the head of tree 33 // Output: the head of sorted double-linked list 34 // / 35 public static Node convertTree(Node root) 36 { 37 treeToList(root); 38 39 // Get the head of the double-linked list 40 Node pHead = pLast; 41 while (pHead != null && pHead.left != null) 42 pHead = pHead.left; 43 44 return pHead; 45 46 }
转载于:https://www.cnblogs.com/WayneZeng/p/9290748.html
【IT笔试面试题整理】二叉搜索树转换为双向链表相关推荐
- [二叉树]二叉搜索树转换为双向链表(剑指Offer26)
[试题描述] 将二叉搜索树转换为双向链表 对于二叉搜索树,可以将其转换为双向链表,其中,节点的左子树指针在链表中指向前一个节点,右子树指针在链表中指向后一个节点. 思路一: 采用递归思想,对于二叉搜索 ...
- 剑指offer:面试题36. 二叉搜索树与双向链表
题目: 二叉搜索树与双向链表 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表.要求不能创建任何新的节点,只能调整树中节点指针的指向. 为了让您更好地理解问题,以下面的二叉搜索树为例: ...
- 面试题27.二叉搜索树与双向链表
题目:输入一颗二叉搜索树,将该二叉搜索树转换为一个排序的双向链表.要求不能创建 任何新的结点,只能调整树种结点指针的指向.比如输入下图的二叉搜索树,则输出转换 后的双向排序链表. 1 10 2 / \ ...
- 剑指Offer - 面试题36. 二叉搜索树与双向链表(中序循环/递归)
1. 题目 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表.要求不能创建任何新的节点,只能调整树中节点指针的指向. 特别地,我们希望可以就地完成转换操作.当转化完成以后,树中节点的左指 ...
- leetcode —— 面试题36. 二叉搜索树与双向链表
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表.要求不能创建任何新的节点,只能调整树中节点指针的指向. 解题思路:二叉搜索树的特点是当前节点的左子树的值小于当前节点,当前节点的右子树的 ...
- 剑指offer面试题[27]-二叉搜索树与双向链表
题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. /* struct TreeNode {int val;struct Tr ...
- 剑指offer面试题36. 二叉搜索树与双向链表(中序遍历)(递归)
题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表.要求不能创建任何新的节点,只能调整树中节点指针的指向. 思路 详见链接 代码 #class Node: # def __ini ...
- java面试(二)--(1)EJB的几种类型(2)Hibernate的悲观锁和乐观锁(3) 二叉搜索树与双向链表
1.请说明一下EJB的几种类型分别是什么? EJB(Enterprise JavaBean)是J2EE服务器端的组件模型,EJB包括会话Bean(Session Bean).实体Bean(Entity ...
- 【重点】剑指offer——面试题27:二叉搜索树与双向链表
剑指offer--面试题27:二叉搜索树与双向链表 Solution1: 这是书上的代码,要理解好最近几道题,对指针的操作比较多... class Solution { public:TreeNode ...
最新文章
- java filefilter递归_Java中的递归+文件过滤器
- powerdesigner生成php代码,让powerdesigner生成的sql语句在mysql上成功执行
- python程序设计 清华大学出版社 pdf下载-清华大学出版社-图书详情-《Python程序设计》...
- 树状数组的区间修改+查询
- OpenCV鼠标事件和滑动条事件
- 知乎阅读三百万的生信学习指南
- 给定数组,去掉0元素后将剩下的元素赋给新的数组
- php分批处理数据,php分批更新数据
- 网络强制消费案例剖析
- Spring中的@Value注解详解
- Linux的setup命令启动服务名称和功能
- 电动车充电器原理及带电路图维修
- mysql自动跑sql发邮件_SQL server 表数据改变触发发送邮件的方法
- BUPT复试专题—密码(2009)
- vgremore 删除卷组
- Weka的下载与安装
- 常用的端口号(port number)
- Neo4j Desktop 添加算法插件Graph Algorithms
- 电脑蓝屏c语言代码大全,电脑蓝屏代码C0000218怎么解决方法
- 先决条件(一)问题定义和需求分析