考研编程-树
文章平均质量分 50
考研中树的编程题
Jiawen9
从来不自诩有不带偏见看待事物的所谓眼界和宽容,但会一直坚守接触之后能重新认识人和事物的勇气。
展开
-
【数据结构·考研】后序线索二叉树
后序线索二叉树c++实现原创 2023-03-09 18:01:56 · 1686 阅读 · 2 评论 -
【数据结构·考研】先序线索二叉树
先序线索二叉树c++实现原创 2023-03-09 17:47:04 · 1238 阅读 · 6 评论 -
【数据结构·考研】二叉搜索树的插入与删除
建立一棵二叉搜索树二叉搜索树的巨大优势就是:在平均情况下,能够在 O(logN) 的时间内完成搜索和插入元素。递归版本://插入值为key的结点(递归) TreeNode* insertIntoBST(Tree& t, int key) { if(t == NULL){ //找到插入目标 t = new TreeNode; t->val = key; return t; } if(key > t->原创 2020-09-04 21:55:46 · 1853 阅读 · 0 评论 -
【数据结构·考研】树的孩子兄弟表示法
树的孩子兄弟表示法也叫树的二叉树表示法。树的左指针指向自己的第一个孩子,右指针指向与自己相邻的兄弟。结构的最大优点是:它和二叉树的二叉链表表示完全一样。可利用二叉树的算法来实现对树的操作 。左孩子右兄弟表示的树的高度因为二叉树表示法的根节点没有右孩子,所以树高就是左子树树高 + 1。然后我们看下根节点第一个孩子的高度,由于第一个孩子的右子树和第一个孩子的高度是相同的,所以比较左子树 + 1的高度来和右子树来比较,如果 左子树 + 1 > 右子树,高度取左子树 + 1,否则取右.原创 2020-09-03 23:53:35 · 15376 阅读 · 4 评论 -
【数据结构·考研】二叉树的最小深度
二叉树的最小深度最小深度是从根节点到最近叶子节点的最短路径上的节点数量。递归的遍历左右子树,如果走到一个叶子结点,返回 0 ,比较叶子结点父亲的左右子树高度,返回较小的一棵高度 +1。以后直接返回高度 + 1。代码如下:#include<iostream>#include<algorithm>using namespace std;typedef struct node{ char val; struct node* left; struct node原创 2020-09-03 20:36:27 · 291 阅读 · 0 评论 -
【数据结构·考研】判断平衡二叉树
判断一棵树是不是平衡二叉树一棵树是平衡二叉树,当且仅当它的左右子树皆是平衡二叉树并且左右子树高度差小于绝对值 1 。判断的方式和判断满二叉树的方式很相似。完整代码如下:#include<iostream>#include<algorithm>using namespace std;typedef struct node{ char val; struct node* left; struct node* right;}TreeNode,*Tree;原创 2020-09-03 00:35:11 · 295 阅读 · 5 评论 -
【数据结构·考研】判断二叉搜索树
判断一棵二叉树是不是二叉搜索树对一棵二叉树进行中序遍历可以得到一个递增序列,基于这个思想,我们可以写出递归和非递归的代码,它们都是基于二叉树的中序遍历。递归版本://递归/*中序遍历*/ int last = INT_MIN; //pre保存当前结点中序前趋的值 bool isValidBST(Tree& t){ if(t == NULL) return true; if(isValidBST(t->left)){ //检查左子树 if(last < t-原创 2020-09-03 00:28:46 · 236 阅读 · 0 评论 -
【数据结构·考研】交换二叉树的左右子树
交换二叉树的左右子树采用递归算法实现,想要交换 t 的左右子树,首先交换 t 的左子树的左右子树,再交换 t 的右子树的左右子树,最后交换 t 的左右子树,结点为空是边界条件。总的运行情况就是先遍历到树的边缘,然后从下往上交换,直至整棵树的左右子树都被交换。void swap(Tree& t){ if(t == NULL) return; //空结点返回上一层 swap(t->left); //实现左子树的交换 swap(t->right); //实现右子树的交换原创 2020-09-01 10:42:39 · 5463 阅读 · 0 评论 -
【数据结构·考研】相似的二叉树 & 相同的二叉树
相似的树如果两棵二叉树在结构上相同,则认为它们是相似的。这道题用递归的方式来做最简单,递归的遍历两棵二叉树相同的位置。两棵二叉树 t1 和 t2 皆为空或者皆不空且 t1 的左右子树和 t2 的左右子树分别相似,则可以判断出 t1 和 t2 相似。//相似的树bool isSimilarTree(Tree& t1,Tree& t2){ if(t1 == NULL && t2 == NULL) return true; if(!(t1 &&原创 2020-08-31 20:05:06 · 2581 阅读 · 0 评论 -
【数据结构·考研】判断完全二叉树
判断一棵二叉树是不是完全二叉树一棵二叉树,除最后一层外,是一棵满二叉树,最后一层可以不满,但是必须从左往右连续的有。完全二叉树的不对称性决定了判断是不是一棵二叉树是不是完全二叉树最好要用非递归广度优先遍历。在一般的广度优先遍历中,出队一个结点后检查是否有左右孩子,有的话相应孩子进队。在这道题中,无论有没有左右孩子都进队,得到第一个NULL结点时判断队列里有没有非空结点,有的话它就不是一棵完全二叉树。代码如下:#include<iostream>#include<原创 2020-08-31 14:50:17 · 608 阅读 · 0 评论 -
【数据结构·考研】判断满二叉树
判断一棵二叉树是不是满二叉树除最后一层无任何孩子外,每一层上的所有结点都有左右孩子的二叉树叫做满二叉树。判断一棵二叉树是不是满二叉树,首先是递归的方法:空树是满二叉树,非空的树当且仅当它的左右子树都是满二叉树的时候,它就是一棵满二叉树。每个子树应当满足:① 同时存在左子树和右子树;② 左右子树高度相同。/*每个节点都存在左右孩子并且左右子树深度相同时是满二叉树*/ int Height(Tree& t){ if(t == NULL) return 0; return He原创 2020-08-31 14:18:25 · 5118 阅读 · 2 评论 -
【数据结构·考研】二叉树的结点个数
二叉树的结点个数非递归的求法很简单,每出队一个结点,count++。递归的解法,从上自下遍历到最底端,返回左右子树结点数+1,代表左右子树的结点再加上父结点的个数。代码如下:#include<iostream>#include<queue>#include<vector>using namespace std;typedef struct node{ char val; struct node* left; struct node* righ原创 2020-08-28 07:37:06 · 1182 阅读 · 0 评论 -
【数据结构·考研】二叉树叶子结点的个数
二叉树叶子结点的个数非递归的求法,用广度优先遍历,每出队一个结点,判断它是不是叶子结点。非递归的做法,先由上自下遍历,等遍历到叶子处再逐层返回左右子树的叶子结点总和,最后得到整棵树的叶子结点数。代码如下:#include<iostream>#include<queue>#include<vector>using namespace std;typedef struct node{ char val; struct node* left; st原创 2020-08-27 20:11:59 · 7449 阅读 · 3 评论 -
【数据结构·考研】二叉树的宽度
二叉树的最大宽度求二叉树的宽度,我们首先想到他是广度(宽度)优先遍历的专利,记录每层结点数,取最大返回就是二叉树的宽度,如果我们想要用非递归的办法来解决的话,就需要设置一个数组来存储每层的结点数,然后引用一个 max 来记录最大结点数。这样的话就是相当于把非递归强行写成了递归,递归只起到了遍历的作用,所以此时更新 max 的时机可以是前中后任何一个地方。代码如下:#include<iostream>#include<queue>#include<vector&原创 2020-08-27 18:46:05 · 7454 阅读 · 1 评论 -
【数据结构·考研】二叉树的高度(深度)
二叉树的高度(深度)二叉树的高度和深度其实是相同的东西。自下向上称作计算高度,由上到下称为计算深度。求二叉树的深度也有递归和非递归的方法。递归的方法就是一直递归到树的最边缘,通过比较当前左右子树的高度,取大的一方+1继续向上累积,直到比较到根节点的左右子树高度,然后取大的一棵+1就是最后树高。而非递归的方式是利用到树的层次遍历,每遍历一层+1,直到遍历完整棵树。代码如下:#include<iostream>#include<queue>using namespace原创 2020-08-27 09:47:08 · 3641 阅读 · 0 评论 -
【数据结构·考研】层次遍历二叉树
层次遍历(广度优先遍历)二叉树广度优先遍历在图和树中都被用来寻找最短路径,它每次会寻找一个离自己最近的结点,用队列来实现。先把根节点进队,然后每出队一个结点,它的左右结点进队,直到队为空。代码如下:#include<iostream>#include<queue>using namespace std;typedef struct node{ char val; struct node* left; struct node* right;}TreeNod原创 2020-08-26 12:07:05 · 360 阅读 · 0 评论 -
【数据结构·考研】后序遍历二叉树
后序遍历二叉树递归的后序遍历二叉树还是和之前一样,调整一下输出语句就可以。非递归有两种方式,一种是规规矩矩的类似中序的迭代,另一种是通过倒序输出镜像前序的序列来得到后序序列。依旧是那棵老树:/*------------树的形状: a b c d e f --------------*/代码如下:#include<iostream>#include<queue>#include<stack>using nam原创 2020-08-26 11:15:17 · 309 阅读 · 0 评论 -
【数据结构·考研】中序遍历二叉树
中序遍历二叉树中序遍历二叉树的非递归实现:先不停往左孩子方向走,一边往左走一边入栈,等走到尽头后输出一个结点来访问,然后走向这个结点的右孩子。在右孩子结点非空或栈非空的状态下,不停迭代上述过程。#include<iostream>#include<stack>#include<queue>using namespace std; typedef struct node{ char val; struct node* left; struct原创 2020-08-25 18:52:17 · 409 阅读 · 0 评论 -
【数据结构·考研】前序遍历二叉树
前序遍历二叉树前序遍历二叉树的方式是 LVR 即左 - 根 - 右。一般有递归和非递归两种方式,递归的方式就是先访问父结点,然后递归的访问左子树,再递归的访问右子树。非递归在访问完父节点后先把右子树压栈,再把左子树压栈,然后栈非空的条件下继续迭代访问,与递归前序的思想完全相同。依旧是这棵老树:/*------------树的形状: a b c d e f --------------*/代码如下:#include<iostream>原创 2020-08-24 21:07:59 · 546 阅读 · 0 评论 -
【数据结构·考研】先序构造二叉树
在跑程序构造一棵二叉树时,我们经常使用先序构造的方式。先创建一个结点赋值,然后再递归的构造它的左右子树。例如我们约定好以' # '结束输入,构造下面形状的一棵二叉树:/*------------树的形状: a b c d e f --------------*/我们以先序的方式输入这棵树:a b d # # e # # c f # # #,最后以层次的方式展示出来。代码如下:#include<iostream>#include<原创 2020-08-23 16:31:01 · 1734 阅读 · 0 评论 -
【数据结构·考研】前序遍历与中序遍历构造二叉树
题目:根据一棵树的前序遍历与中序遍历构造二叉树。思路:中序遍历可以通过前序遍历的第一个元素把自己划分为根和左右子树。去掉第一个元素的前序序列,与中序左子树相同个数的元素是左子树,剩下的元素是右子树。TreeNode* buildTree(char* preorder,char* inorder, int n){ //先序序列,中序序列,序列长 if(n <= 0) return NULL; //序列长度小于1,返回NULL //待插入的新结点p TreeNode* p = new原创 2020-11-12 20:27:04 · 190 阅读 · 0 评论 -
【数据结构·考研】 二叉树的最近公共祖先
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。.原创 2020-11-11 21:13:15 · 849 阅读 · 0 评论 -
【数据结构·考研】二叉树的路径总和
题目一:二叉树采用二叉链表存储表示。编写算法求取一棵二叉树的路径长度。(二叉树的路径长度是指从树根到树中所有结点的路径长度之和,二叉树中结点的路径长度为该结点所在层次值-1,根结点为第1层,以此类推)树的结构声明:typedef struct node{ char val; struct node* left; struct node* right;}TreeNode,*Tree;int PathSum(Tree& t){ if(t == NULL) return 0;原创 2020-11-10 17:02:42 · 716 阅读 · 1 评论 -
【数据结构·考研】中序线索二叉树
中序线索二叉树在 n 个结点的二叉链表中,有(n+1)个空指针域,利用这些空指针域来存放当前结点的直接前驱和后继的线索,可以加快查找速度。普通二叉树只能找到结点的左右孩子信息,而结点的直接前驱和直接后继只能在遍历中获得,若将遍历后对应的前驱和后继预存起来,从第一个结点开始就可以顺藤摸瓜而遍历整棵树,树实际变成了线性序列。例如中序遍历的结果实际上就是把二叉树转化成了线性排列。线索二叉树的结构声明typedef struct node{ struct node* left; int l原创 2020-09-05 11:18:04 · 5486 阅读 · 1 评论 -
【数据结构·考研】并查集
并查集并查集用来判断一个图中的两个点是否连通,通过标记确定该成员所在的团队,每个团队都有自己的领头羊。我们给每个成员赋初值为 -1 ,那么下标对应值为 -1 的即为这个团队的领头羊。vector<int> parent(6,-1);每个团队都有自己的代理人,如何找到它呢?顺着这个成员往它的上级找,找到标记为 -1 的成员,就抓住了领头羊。//查询操作 int getFather(int x){ return parent[x] == -1 ? x : getFathe原创 2020-09-04 23:24:36 · 562 阅读 · 0 评论