二叉链表

LeetCode解题汇总目录

a 夏天 提交于 2019-12-02 17:37:52
此篇为学习完 《数据结构与算法之美》 后,在 LeetCode 刷题的汇总目录,方便大家查找(Ctrl+F ind ),一起刷题,一起PK交流!Updated on 2019.12.2 刷题可以按照 不同的专题 进行,便于加强某个知识点的理解。 我的 LeetCode 主页 我的 GitHub 主页 已解决 519/1185 - 简单 281 中等 208 困难 30 2019.7.24 - 2019.11.9,108天做了400道题 2019.11.9 - 2019.11.24, AC+100道,4个月共计500道题 参赛记录 LeetCode 2019 力扣杯全国秋季编程大赛 ​ 已解题目,部分太简单的没有列出 LeetCode 1. 两数之和(哈希) LeetCode 2. 两数相加(单链表反转) LeetCode 3. 无重复字符的最长子串(滑动窗口+哈希) LeetCode 4. 寻找两个有序数组的中位数(二分查找,难) LeetCode 7. 整数反转 LeetCode 8. 字符串转换整数 (atoi) LeetCode 9. 回文数 LeetCode 11. 盛最多水的容器(双指针) LeetCode 14. 最长公共前缀 LeetCode 15. 三数之和 LeetCode 16. 最接近的三数之和(固定左端+滑动窗口) LeetCode 17.

剑指offer--链表、树--二叉搜索树与双向链表

与世无争的帅哥 提交于 2019-12-02 15:05:35
二叉搜索树与双向链表 题目 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的 双向链表 。要求不能创建任何新的结点,只能调整树中结点指针的指向。 思路 举例说明: 二叉搜索树如上图所示,我们将其转换为配需双向链表。 根据二叉搜索树的特点:左结点的值<根结点的值<右结点的值,我们不难发现,使用 二叉树 的中序遍历出来的数据的数序,就是排序的顺序。因此,首先,确定了二叉搜索树的遍历方法。 接下来,我们看下图,我们可以把树分成三个部分:值为10的结点、根结点为6的左子树、根结点为14的右子树。根据排序双向链表的定义,值为10的结点将和它的左子树的最大一个结点链接起来,同时它还将和右子树最小的结点链接起来。 按照中序遍历的顺序,当我们遍历到根结点时,它的左子树已经转换成一个排序的好的双向链表了,并且处在链表中最后一个的结点是当前值最大的结点。我们把值为8的结点和根结点链接起来,10就成了最后一个结点,接着我们就去遍历右子树,并把根结点和右子树中最小的结点链接起来。 主函数 打印函数 public static void main(String[] args) { TreeNode node10 = new TreeNode(10); TreeNode node6 = new TreeNode(6); TreeNode node14 = new TreeNode(14); TreeNode

【数据结构】基于二叉链表的二叉树最长路径的求解

对着背影说爱祢 提交于 2019-12-02 01:10:46
描述 设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,编写算法求出该二叉树中第一条最长的路径。 输入 多组数据。每组数据一行,为二叉树的先序序列(序列中元素为‘0’时,表示该结点为空)。当输入只有一个“0”时,输入结束。 输出 每组数据输出一行,第一行为二叉树的最长路径长度,第二行为此路径上从根到叶结点的各结点的值。 样例输入1 复制 abcd00e00f00ig00h00 abd00e00cf00g00 0 样例输出1 4 abcd 3 abd #include<iostream> using namespace std; #define MAX 500 typedef struct binode { char data; binode *lchild,*rchild; }*bitree; void create(bitree &T) { char ch; cin>>ch; if(ch=='0') T=NULL; else { T=new binode; T->data=ch; create(T->lchild); create(T->rchild); } } void longestpath(bitree &T,char path[],char longestp[],int &longest,int &len) {//char path[]

二叉链表实现二叉树

吃可爱长大的小学妹 提交于 2019-12-02 01:10:09
编写程序,用二叉链表存储表示方法,实现二叉树的基本操作。 (1) 根据扩展二叉树的前序遍历序列,建立二叉树。 (2) 根据二叉树的前序和中序遍历序列,构造二叉树。 (3) 实现二叉树的前序、中序和后序遍历,输出遍历结果。 /*编写程序,用二叉链表存储表示方法,实现二叉树的基本操作。 (1) 根据扩展二叉树的前序遍历序列,建立二叉树。 (2) 根据二叉树的前序和中序遍历序列,构造二叉树。 (3) 实现二叉树的前序、中序和后序遍历,输出遍历结果。*/ #include<iostream> using namespace std; template<class DataType> struct BiNode//定义二叉链表的结点 { DataType data;//假设二叉树的数据元素为char型 BiNode<DataType>*lchild,*rchild; }; //类BiTree的声明 template <class DataType> class BiTree { public: BiTree(){root=Create(root);}//构造函数,建立一棵二叉树 ~BiTree(){Release(root);}//析构函数,释放各结点的存储空间 void PreOrder(){PreOrder(root);}//前序遍历二叉树 void InOrder(){InOrder

【数据结构】基于二叉链表的二叉树左右孩子的交换

﹥>﹥吖頭↗ 提交于 2019-12-02 01:09:39
描述 设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表 ,编写 递归 算法交换该二叉树的左右孩子。 输入 多组数据。每组数据一行,为二叉树的先序序列(序列中元素为‘0’时,表示该结点为空)。当输入只有一个“0”时,输入结束。 输出 每组数据输出一行。为交换左右孩子后的二叉树的先序序列。 样例输入1 abcd00e00f00ig00h00 abd00e00cf00g00 0 样例输出1 aihgbfced acgfbed 递归 #include<iostream> using namespace std; typedef struct binode { char data; binode *rchild,*lchild; }*bitree; void create(bitree &T) { char ch; cin>>ch; if(ch=='0') T=NULL; else { T=new binode; T->data=ch; create(T->lchild); create(T->rchild); } } void change(bitree &T) { bitree temp; if(T->lchild==NULL ||T->rchild==NULL)//左或右子树为空返回上层递归 return ; else//左右子树交换 { temp=T->lchild

二叉树存储方式-二叉链表

这一生的挚爱 提交于 2019-12-02 01:09:29
二叉树一般有两种存储方式:(1)数组方式(2)链表方式 (1)数组存储方式 上面两个二叉树对应的链表存储为: 我们采用层序遍历的方式将二叉树各个节点进行编号(这里的编号我们是把二叉树均看成满二叉树进行编号的,这样编号的好处是方便我们根据编号轻松定位节点位置),并将节点数据存放在对应编号下。 我们可以看出对于满二叉树(就是除了叶结点外每一个结点都有左右子叶且叶结点都处在最底层的二叉树)。是很适合用数组存储的,但是对于非满二叉树,如果我们用数组方式存放就会浪费存储空间。如果二叉树非常庞大,这部分的浪费将是巨大的。所以一般情况下,我们更普遍的采用链式存储结构存储二叉树。 (2)二叉树链表 二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。 通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址。其结点结构为: 其中,data域存放某结点的数据信息;lchild与rchild分别存放指向左孩子和右孩子的指针,当左孩子或右孩子不存在时,相应指针域值为空(用符号∧或NULL表示)。利用这样的结点结构表示的二叉树的链式存储结构被称为二叉链表。如下图所示: 为了方便访问某结点的双亲(节点的子节点和父节点),还可以给链表结点增加一个双亲字段parent,用来指向其双亲结点。每个结点由四个域组成

建立二叉树的二叉链表存储结构(严6.70)

荒凉一梦 提交于 2019-12-02 01:09:15
Description 如果用大写字母标识二叉树结点,则一棵二叉树可以用符合下面语法图的字符序列标识,试编写递归程序,由这种形式的字符序列,建立相应的二叉树的二叉链表存储结构(附图见《严蔚敏:数据结构题集(C语言版)》第45页6.70) Input 输入如图所示的字符序列 Output 建立相应二叉树的二叉链表存储结构,并先序遍历输出 SampleInput A(B(#,D),C(E(#,F),#)) SampleOutput AB#DCE#F# #include<stdio.h> #include<stdlib.h.> #include<malloc.h> typedef struct node { char data; struct node *lchild,*rchild; }BiTNode,*BiTree; void create(BiTree*t) { char s,s1; *(t)=(BiTree)malloc(sizeof(BiTNode)); scanf("%c",&s); s1=s; scanf("%c",&s); (*(t))->lchild=NULL; (*(t))->rchild=NULL; if(s1==',') { (*(t))->data=s; scanf("%c",&s1); if(s1=='(') { create(&((*(t))->lchild

二叉链表存储的二叉树

孤者浪人 提交于 2019-12-02 01:08:59
题目描述 树形结构是一类重要的非线性数据结构,其中以树和二叉树最为常用。对于每一个结点至多只有两课子树的一类树,称其为二叉树。二叉树的链式存储结构是一类重要的数据结构,其形式定义如下: 而二叉树的前序、中序遍历是非常重要的能够访问二叉树所有结点的算法,下面分别列出一种先序遍历和两种中序遍历的算法。 第一种中序遍历的方法(算法6.3): 第二种中序遍历的方法(算法6.2): 通过读入一个字符串,建立二叉树的算法如下: 在本题中,将会给出一个按照先序遍历得出的字符串,空格代表空的子节点,大写字母代表节点内容。请通过这个字符串建立二叉树,并按照题目描述中的一种先序遍历和两种中序遍历的算法分别输出每一个非空节点。 输入 输入只有一行,包含一个字符串S,用来建立二叉树。保证S为合法的二叉树先序遍历字符串,节点内容只有大写字母,且S的长度不超过100。 输出 共有三行,每一行包含一串字符,表示分别按先序、中序、中序得出的节点内容,每个字母后输出一个空格。请注意行尾输出换行。 样例输入 ABC DE G F 样例输出 A B C D E G F C B E G D F A C B E G D F A 代码: #include<cstdio> #include<cstdlib> #include<iostream> #include<cstring> using namespace std;

【数据结构】基于二叉链表的二叉树最大宽度的计算

我的未来我决定 提交于 2019-12-02 01:08:44
描述 设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,编写算法计算该二叉树的最大宽度(二叉树的最大宽度是指二叉树所有层中结点个数的最大值)。 输入 多组数据。每组数据一行,为二叉树的先序序列(序列中元素为‘0’时,表示该结点为空)。当输入只有一个“0”时,输入结束。 输出 每组数据输出一行。为二叉树的最大宽度。 样例输入1 复制 abcd00e00f00ig00h00 abd00e00cf00g00 0 样例输出1 4 4 这道题不太好理解(对我这个菜鸡来说) 首先理一下思路 求最大宽度 -> 用层次遍历 -> 先入先出 -> 队列 以下是详解 剩下的就不列出来了 代码实现: #include<iostream> #include<queue> using namespace std; typedef struct binode { char data; binode *lchild,*rchild; }*bitree; void create(bitree &T) { char ch; cin>>ch; if(ch=='0') T=NULL; else { T=new binode; T->data=ch; create(T->lchild); create(T->rchild); } } int wid(bitree &T) { if(T==NULL)

【数据结构】基于二叉链表的二叉树叶子结点到根结点的路径的求解

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-02 01:06:50
描述 设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,编写算法求出每个叶子结点到根结点的路径。 输入 多组数据。每组数据一行,为二叉树的先序序列(序列中元素为‘0’时,表示该结点为空)。当输入只有一个“0”时,输入结束。 输出 每组数据输出n行(n为叶子结点的个数),每行为一个叶子结点到根节点的路径(按照叶子结点从左到右的顺序)。 样例输入1 复制 abcd00e00f00ig00h00 abd00e00cf00g00 0 样例输出1 dcba ecba fba gia hia dba eba fca gca #include<iostream> using namespace std; #define MAX 500 typedef struct binode { char data; binode *lchild,*rchild; } *bitree; void create(bitree &T) { char ch; cin>>ch; if(ch=='0') T=NULL; else { T=new binode; T->data=ch; create(T->lchild); create(T->rchild); } } void longestpath(bitree &T,char path[],int len) { if(T) { if(T-