树与二叉树
星辰浩宇
路在脚下
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
先序+中序遍历重建二叉树
假设已知先序序列为pre1,pre2,pre3……pren,中序序列为in1,in2,in3,……,inn,如图所示,那么由先序序列的性质可知,先序序列的第一个元素pre1是当前二叉树的根节点,再由中序序列的性质可知,当前二叉树的根节点将中序序列划分为左子树和右子树。因此,要做的就是在中序序列中找到某个结点ink,使的ink==pre1,这样就在中序序列中找到了根节点。易知左子树的结点个数是num...原创 2019-08-14 14:22:01 · 291 阅读 · 0 评论 -
二叉树的遍历
二叉树的遍历是指通过一定的顺序访问二叉树的所有结点。遍历方法一般有四种:先序遍历、中序遍历、后序遍历和层次遍历,其中,前三种一般使用深度优先搜索(DFS)实现,而层次遍历一般使用广度优先搜索(BFS)实现把一颗二叉树分为三个部分:根节点、左子树、右子树,且对左子树和右子树可以同样进行这样的划分,这样对树的遍历就可以分为对这三个部分的遍历,这三种方法中,左子树一定要先于右子树遍历,且所谓的“先中...原创 2019-08-14 14:19:59 · 776 阅读 · 0 评论 -
二叉树的递归定义
首先直接给出二叉树的递归定义1、要么二叉树没有根节点,是一颗空树2、要么二叉树由根节点、左子树、右子树组成,且左子树和右子树都是二叉树。递归定义就是用自身来定义自身递归函数必须存在两个概念:递归边界和递归式。其中递归式用来将大问题分解为与大问题性质相同的若干个小问题,递归边界则用来停止无休止的递归。二叉树的递归定义如下;二叉树中任何一个结点的左子树既可以是一颗空树,也可以是一颗...原创 2019-08-13 09:06:56 · 4226 阅读 · 0 评论 -
树的定义与性质
树的概念在数据结构中,把树枝分叉处、树叶、树根抽象为结点,其中树根抽象为根节点,且对一棵树来说最多存在一个根节点;把树叶概括为叶子节点,且叶子结点不再延伸出心得结点,把茎秆和树枝统一抽象为边,且一条边只能用来连接两个结点(一个端点一个)。这样,树就被定义为由若干结点和若干条边组成的数据结构,且在树中的结点不能被边连接成环。树的常见性质1、树可以没有结点,这种情况下称之...原创 2019-08-13 08:45:58 · 747 阅读 · 0 评论 -
平衡二叉树的基本操作
和二叉查找树相同,AVL树的基本操作有查找、插入、建树以及删除。查找操作由于AVL树是一颗二叉查找树,因此其查找的操作与二叉查找树相同代码如下:void search(node *root,int x){ if(root==NULL){ printf("search failed\n"); return; } if(x==root->data){...原创 2019-08-15 16:23:51 · 840 阅读 · 0 评论 -
二叉排序树(二叉查找树、二叉搜索树)
二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树。定义二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:(1)若左子树不空,则左子树上所有节点的值均小于它的根节点的值;(2)若右子树不空,则右子树上所有节点的值均大于它的根节点的值;(3)左、右子树也分别为二叉排序树;(4)没有键值相等的节点。查找...原创 2019-08-20 13:07:07 · 963 阅读 · 0 评论 -
二叉查找树的基本操作
二叉查找树的基本操作有查找、插入、建树、删除查找操作在之前介绍的二叉树的查找操作时,由于无法确定二叉树的具体特性,因此只能对左右子树都进行递归遍历,但是二叉查找树的性质决定了可以只选择其中的一种进行遍历,因此查找将会是从树根到查找结点的一条路径,故最坏复杂度为O(h),其中h是二叉查找树的高度,于是可以得到查找操作的基本思路如果当前根结点root为空,说明查找失败,返回 如果需...原创 2019-08-15 07:31:06 · 578 阅读 · 0 评论 -
二叉查找树(BST)的定义
二叉查找树(Binary Search Tree,BST)是一种特殊的二叉树,又称为排序二叉树、二叉搜索树、二叉排序树。二叉查找树的递归定义如下:要么二叉查找树是一颗空树 要么二叉查找树由根结点、左子树和右子树组成。其中左子树和右子树都是二叉查找树,且左子树上所有结点的数据域均小于或等于根结点的数据域,右子树上所有结点的数据域均大于根结点上的数据域。从二叉查找树的定义中可以知道,二叉查找树...原创 2019-08-15 07:30:50 · 770 阅读 · 0 评论 -
从树的遍历看DFS和BFS
深度优先搜索(DFS)与先根遍历事实上,对所有合法的DFS求解过程,都可以将其画为树的形式,DFS的过程就是对这颗树进行先根遍历的过程。于是我们可以从中得到启发:碰到一些可以用DFS做的题目,可以把一些状态作为树的结点,然后问题就会转换为直观的对树进行先根遍历的问题。如果想要得到树的某些信息,也可以借助DFS以深度作为第一关键词的思想来对结点进行遍历,以获得所需要的结果。例如求解叶子...原创 2019-08-14 15:57:25 · 239 阅读 · 0 评论 -
树的遍历
树的先根遍历树的先根遍历,即总是先访问根节点,再去访问左右子树,是一个递归访问的概念,因为对根结点的子树而言,同样可以划分为根节点和若干子树,这种遍历方式称为树的先根遍历。代码如下:(简单框架)void preorder(int root){ printf("%d",Node[root].data);//访问当前结点 for(int i=0;i<Node[root]....原创 2019-08-14 15:38:40 · 906 阅读 · 0 评论 -
树的静态写法
此处的树,子结点的个数没有限制且子结点没有先后次序的树树与二叉树的不同之处就在于树的子结点数可能会有很多,如果利用动态写法,利用链表的指针来指示的话会比较麻烦,利用静态写法,也就是用数组下标来代替所谓的地址,当然这需要事先开一个大小不低于结点上限个数的结点数组,因此结构体node的定义如下:struct node{ typename data;//数据域 int child[maxn...原创 2019-08-14 15:16:08 · 433 阅读 · 0 评论 -
二叉树的静态实现
二叉树的静态实现可以满足完全不使用指针,而简单使用数组来完成二叉树的所有操作。在定义二叉树时,采用的是二叉链表的结构,如下所示:struct node{ typename data;//数据域 node *lchild;//指向左子树的根结点的指针 node *rchild;//指向右子树的根结点的指针 };在这个定义中,为了能够实时控制新生成的结点的个数,结构体node中的...原创 2019-08-14 14:49:52 · 394 阅读 · 0 评论 -
后序+中序重建二叉树
模板如下:模板中最后的输出为层次遍历代码如下:#include<bits/stdc++.h>using namespace std;const int N=35;int post[N],in[N];int n;struct node{ int data; node *lchild=NULL; node *rchild=NULL;};node *create...原创 2019-08-14 14:22:15 · 594 阅读 · 0 评论 -
二叉树的存储结构与基本操作
二叉树的存储结构一般来说,二叉树使用链表来定义。和普通链表的区别是,由于二叉树的每个结点有两条出边,因此指针变成了两个-分别指向左子树的根节点地址和右子树的根节点的地址。如果某个子树不存在,则指向NULL,其他地方和普通链表完全相同,因此又把这种链表叫做二叉链表。定义方式如下:struct node{ typename data;//数据域 node *lchild;//指...原创 2019-08-14 14:19:41 · 1229 阅读 · 0 评论
分享