二叉链表

二叉搜索树与双向链表

て烟熏妆下的殇ゞ 提交于 2020-03-23 17:21:25
1:题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。 为了让您更好地理解问题,以下面的二叉搜索树为例: 我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于双向循环链表,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。 下图展示了上面的二叉搜索树转化成的链表。“head” 表示指向链表中有最小元素的节点。 特别地,我们希望可以就地完成转换操作。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继。还需要返回链表中的第一个节点的指针。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-yu-shuang-xiang-lian-biao-lcof 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 2:题目分析 解题思路:对于二叉排序树而言,其中序遍历输出就是升序排序。那我们怎么将其做成双向链表尼?着手点肯定是中序遍历;在遍历的迭代逻辑中,我们要将前次迭代和本次迭代处理的节点,按照双向链表的要求进行处理。怎么处理尼?通过一个全局变量保存上次遍历的节点,然后再本次遍历的节点处理中进行如下操作: preNode.right =

未 二叉搜索树与双向链表

走远了吗. 提交于 2020-02-26 13:26:58
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。 /** public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ ///??????????????????????????????? public class Solution { TreeNode head = null; TreeNode realHead = null; public TreeNode Convert(TreeNode pRootOfTree) { ConvertSub(pRootOfTree); return realHead; } private void ConvertSub(TreeNode pRootOfTree) { if(pRootOfTree==null) return; ConvertSub(pRootOfTree.left); if (head == null) { head = pRootOfTree; realHead = pRootOfTree; } else { head.right = pRootOfTree;

C++二叉搜索树与双向链表(剑指Offer精简版)

戏子无情 提交于 2020-02-07 00:52:20
题目:输入一棵二叉搜索树,将该二叉搜素树转换成一个排序的双向链表。 二叉树节点定义如下: struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } }; 解题思路: 由于通过中序排序可以转化为双向链表,因此,通过中序遍历的方法(左根右)的递归方法可以解决问题,解决完之后,pList节点指向双向链表的尾结点,pList节点需要通过遍历,返回到头节点,同样,我们也可以通过逆向中序遍历的方法之间完成,代码如下: class Solution { public: TreeNode* Convert(TreeNode* pRootOfTree) { TreeNode* pList=nullptr;//双向链表的头节点 Convert(pRootOfTree,pList); return pList; } void Convert(TreeNode* pRootOfTree,TreeNode*& pList) { if(pRootOfTree==nullptr)//递归的出口 return; if(pRootOfTree->right!=nullptr)//递归处理右子树 Convert

牛客 二叉搜索树与双向链表

泄露秘密 提交于 2020-02-06 18:34:30
题目要求: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。 解题思路: 思路1: 我们知道双向链表中,每个结点有两个指针域,一个指向前一个结点,一个指向后一个结点。而在二叉树中同样也有两个指针域,一个指向左孩子,一个指向右孩子。所以二叉树和双向链表结构上是相似的。又因为二叉搜索树中,左孩子一定小于父节点,右孩子一定能够大于父节点。所以我们可以将原先指向左孩子的指针当做是链表中指向前一个结点的指针,将原先指向右孩子的指针当做是链表中指向后一个结点的指针。如图: 题目要求转换后是有序的双向链表,因为二叉搜索树的中序遍历是有序的,所以采用中序遍历来完成。当遍历到根节点的时候,只需将根和左子树最大的一个结点链接起来,将跟结点和右子树最小的一个结点链接起来即可。如图: 按照中序遍历递归,当遍历到根结点的时候,说明此事根结点的左子树已经是有序的双向链表了,并且此时链表尾部的值为左子树的最大值。我们将其与根结点链接起来,此时根结点变成了尾部,我们知道根结点后面的节点是右子树最小的结点,将其与根结点链接起来,再继续递归即可解决问题。 代码: class solution1 { TreeNode * head = nullptr ; //进行链接的头 TreeNode * realhead = nullptr ; /

剑指offer——java刷题总结【三】

最后都变了- 提交于 2020-01-19 03:36:07
Note 题解汇总: 剑指offer题解汇总 代码地址: Github 剑指offer Java实现汇总 点击目录中的题名链接可直接食用题解~ 有些解法博文中未实现,不代表一定很难,可能只是因为博主太懒```(Orz) 如果博文中有明显错误或者某些题目有更加优雅的解法请指出,谢谢~ 目录 题号 题目名称 21 栈的压入、弹出序列 22 从上往下打印二叉树 23 二叉搜索树的后序遍历序列 24 二叉树中和为某一值的路径 25 复杂链表的复制 26 二叉搜索树与双向链表 27 字符串的排列 28 数组中出现次数超过一半的数字 29 最小的K个数 30 连续子数组的最大和 正文 21、栈的压入、弹出序列 题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的) 题目分析 解法一: 设置一个指向pop数组的index指针,遍历push数组,针对每一个遍历值做如下操作: 1、将当前遍历值压入栈中; 2、查看栈顶元素和pop数组的当前弹出值是否相等,如果相等则模拟出栈操作,将stack的栈顶元素弹出,并对pop数组的指针进行后移

Tree part 2

我怕爱的太早我们不能终老 提交于 2020-01-14 00:18:34
5. 三叉链表 //三叉链表 //含有n个结点的二叉链表含有n+1个空链域 typedef struct { ElemType data ; struct BitNode * lchild , * rchild , * parent ; } BitNode , * BiTree ; void destroyBiTree ( BiTree & T ) { ` if ( T ) //非空树 { if ( T -> lchild ) DestoryBiTree ( T -> lchild ) ; if ( T -> rchild ) DestoryBiTree ( T -> rchild ) ; free ( T ) ; T = NULL ; } } void createBiTree ( BiTree & T ) { ElemType e ; cin >> e ; } 二、线索二叉树 typedef struct { ElemType data ; struct thNode * lchild , * rchild ; int ltag , rtag ; } thNode , * thTree ; 三、二叉排序树 四、哈夫曼树 基本概念 最优二叉树,树中所有叶结点的带权路径长度和最小的二叉树 算法实现 # include <stdlib.h> # include <stdio.h> #

刷题笔记:二叉树与双向链表(C++)

﹥>﹥吖頭↗ 提交于 2020-01-11 18:54:20
剑指offer刷题笔记 题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。 举例 思路 前面有道也是关于的二叉搜索树的笔记提到搜索二叉树的特点 左子树的数值小于根节点,右子树的数值大于根节点 二叉搜索树的子树也是二叉搜索树 根据上述的特点和所需要的有序结果,采取中序遍历的方式来遍历该二叉搜索树,便会得到一个有序的双向链表 按中序遍历完之后指针会知道链表中的最后一个结点,而需要返回表头,所以需要找到头结点 源代码: /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } };*/ class Solution { public: TreeNode* Convert(TreeNode* pRootOfTree) { TreeNode* pLastNodeInList=NULL; //创建链表 ConvertNode(pRootOfTree,&pLastNodeInList); //找头节点 TreeNode* pHeadOfList=pLastNodeInList; while(pHeadOfList!

26.二叉搜索树与双向链表

六月ゝ 毕业季﹏ 提交于 2019-12-22 06:14:39
layout: post post title: 26.二叉搜索树与双向链表 date: 2019-11-09 11:41:44 categories: 剑指offer tags: 题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。 思路 1、将左子树构成双链表,并返回该链表的头节点(左子树最左边的节点) 2、定位到左链表的最后一个节点(左子树最右边的节点) 3、如果左子树链表不为空,则将当前root追加到左子树链表后 4、将右子树构造成双向链表,并返回链表头结点(右子树最左边的节点) 5、如果右子树链表不为空,将右子树链表追加到当前root后 6、根据左子树链表是否为空返回的整体双向链表的头节点 代码 待写!!! 来源: CSDN 作者: 含糖的八宝粥 链接: https://blog.csdn.net/weixin_42905141/article/details/103641399

简单易懂带你了解二叉树

巧了我就是萌 提交于 2019-12-12 19:31:37
前言 上一篇博客为大家介绍了 数组与链表 这两种数据结构,虽然它们在某些方面有着自己的一些优点,但是也存在着一些自身的缺陷,本篇博客为将为大家介绍一下数据结构--- 二叉树 ,它在保留数组和链表的优点的同时也改善了它们的缺点(当然它也有着自己的缺点,同时它的实现也比较复杂). 1. 数组和链表的特点 数组的优点: 简单易用. 无序数组的插入速度很快,效率为O(1) 有序数组的查找速度较快(较无序数组),效率为O(logN) 数组的缺点: 数组的查找、删除很慢 数组一旦确定长度,无法改变 链表的优点: 可以无限扩容(只要内存够大) 在链表头的新增、删除很快,效率为O(1) 链表的缺点: 查找很慢 在非链表头的位置新增、删除很慢,效率为O(N) 2.树和二叉树 树是一种数据结构,因为它数据的保存形式很像一个树,所以得名为树(树状图). 而二叉树是一种特殊的树, 它的每个节点最多含有两个子树 ,现实世界中的二叉树: 图1 但是实际中的二叉树却是 倒挂 的,如图: 图2 二叉树的名词解释: 根:树顶端的节点称为根。一棵树只有一个根,如果要把一个节点和边的集合称为树,那么从根到其他任何一个节点都必须有且只有一条路径。A是根节点。 父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;B是D的父节点。 子节点:一个节点含有的子树的根节点称为该节点的子节点;D是B的子节点。 兄弟节点

建立二叉树的二叉链表(已知先序和中序,求后序)

匿名 (未验证) 提交于 2019-12-03 00:30:01
建立二叉树的二叉链表(已知先序和中序,求后序) #include <stdio.h> #include <stdlib.h> typedef struct Node { }BiTNode,*PBiTNode; char pre[200],in[200]; PBiTNode CreatepostBiTree(int pre_start,int pre_end,int in_start,int in_end) { } PBiTNode temp() { } void print(PBiTNode bt) { } int main() { } 文章来源: 建立二叉树的二叉链表(已知先序和中序,求后序)