![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构【树】
Curiosity~
知其然,知其所以然,知其所必然
展开
-
【数据结构】(二叉树)求二叉树中两个节点的最近公共祖先节点 递归&&非递归
递归原创 2019-08-02 15:30:35 · 17678 阅读 · 6 评论 -
【数据结构】(二叉树)二叉树删除结点值为x的子树
删除结点值为x的子树方法一递归:原创 2019-08-01 11:17:27 · 19467 阅读 · 4 评论 -
【数据结构】(森林)求以孩子兄弟表示法存储的森林叶子结点数
求以孩子兄弟表示法存储的森林叶子节点数算法思想:在孩子兄弟存储中遵循左孩子右兄弟的规则而叶子结点,反应在二叉树上就是没有左孩子的结点typedef struct node{ int data; node *fch,*nsib; //孩子,兄弟}Tree;int Leaves(Tree *t){ if(!t) return 0; if(t->fch==NULL) ...原创 2019-08-06 09:02:55 · 12947 阅读 · 0 评论 -
【数据结构】(森林)以孩子兄弟链表为存储结构,请设计递归算法求树的深度
以孩子兄弟链表为存储结构,请设计递归算法求树的深度算法思想:求树的深度采用递归的思想就是求每一个兄弟的深度最大值int Height(CSTree bt){ int hc,hs; if(bt==NULL) return 0; else{ hs=Height(bt.nextsibling);//求兄弟结点的深度 hc=Height(bt.firstchild);//求孩...原创 2019-08-06 09:41:46 · 13435 阅读 · 7 评论 -
【数据结构】(二叉树)二叉树的后序遍历非递归
二叉树的后序遍历非递归算法思想:迭代写法,利用pre记录上一个访问过的结点,与当前结点比较,如果是当前结点的子节点,说明其左右结点均已访问,将当前结点出栈,更新pre记录的对象。**//结构体typedef struct BiTree{ char data; BiTree *lchild; BiTree *rchild;}BiTree;//访问结点void visit(...原创 2019-08-01 23:15:19 · 9635 阅读 · 0 评论 -
【数据结构】(树)已知一棵树的层次序列以及每个结点的度,编写算法构造此树的孩子兄弟链表
已知一棵树的层次序列以及每个结点的度,编写算法构造此树的孩子兄弟链表算法思想:已知先序遍历以及结点度数我们只需要编写代码给每一个除根结以外的结点寻找他们的兄弟和孩子(利用度数寻找孩子与兄弟,利用层次遍历构造辅助数组)详见代码void createCSTree_Degree(CSTree *&T,int data[],int degree[],int n){ CSTree **...原创 2019-08-06 10:53:34 · 16959 阅读 · 11 评论 -
【数据结构】(二叉树)打印值为x结点的所有祖先 递归&&非递归
打印值为x结点的送有祖先算法思想: 打印x祖先 首先我们要做的就是查询到这个x值那么如何查询到这个值呢?如何去想我的理解就是在那三个遍历中下手首先我想到了先序遍历并以此写了代码、int flag=0; //定义一个全局遍历来判断是否查找到了值void PrintAncestors(BiTree *T,char x){ if(!T) return; if(T->data=...原创 2019-08-01 23:59:00 · 20719 阅读 · 7 评论 -
【数据结构】(二叉排序树)判断一颗二叉树是否是二叉排序树
算法思想: 二叉排序树的中序遍历是有序(从小到大的)的我们只要按照二叉树中序输出的递归代码模板每次输出是与上一次输出的进行比较即可注意:二叉树中序递归模板见----->传送门int JudgeBST(BSTree *root){ if(root==NULL){ //空树是二叉排序树 return 1; } int a=JudgeBST(root->lchild...原创 2019-08-16 12:31:36 · 8481 阅读 · 4 评论 -
【数据结构】(二叉排序树)求出指定结点在给定二叉树的层次
**算法思想:**求指定结点的层次也就是求指定结点的高度,理论上来说有好几种方法,可以类比二叉树求高度的算传送门进行改造,或者直接根据二叉排序树的查找来直接计算,下面给出直接根据二叉排序树查找直接计算的方法首先给出二叉排序树的查找算法做一下借鉴void BST_Search(BSTree *root,int k){ if(!root) return; while (root){...原创 2019-08-16 14:36:10 · 9452 阅读 · 1 评论 -
【数据结构】(平衡二叉树)判断二叉树是否是平衡二叉树
算法思想:判断一棵树是否为平衡二叉树可以采取高度差的递归方式来判断这个方法比较简单但是复杂度较高(因为高度被重复计算了很多次)O(nlogn)//递归求高度int height(BSTree *root){ if(!root) return 0; int left=height(root->lchild); int right=height(root->rchild...原创 2019-08-16 21:29:34 · 2256 阅读 · 1 评论 -
【数据结构】(二叉排序树)从大到小输出二叉排序树中所有值不小于K的关键字
算法思想:其实就是对二叉树进行遍历我们知道中序遍历二叉树是先左子树后右子树是从小到大的,那么先右子树后所字数是从大到小的可以换个图试一下void InOrder(BSTree *root,int k){ if(!root) return ; InOrder(root->rchild,k); if(root->data>=k){ ...原创 2019-08-16 22:58:24 · 10813 阅读 · 1 评论 -
【数据结构】(二叉树与森林)设F是一个森林,B是由F转换得到的二叉树,F中有n个非终端结点,B中右指针域为空的结点有?
设F是一个森林,B是由F转换得到的二叉树,F中有n个非终端结点,B中右指针域为空的结点有?解题思路:对于树中的非终端节点(也就是分支结点),每个非终端结点至少有一个孩子结点,不管孩子结点有几个(孩子结点必然是有限的)按照森林转化为二叉树的左孩子右兄弟来看,必然最后一个孩子结点的右指针域是空的,因为他是最后一个孩子他已经没用兄弟了所以此时有n个非终端结点那么就会有n个右指针域为空的结点因为我...原创 2019-08-05 11:48:27 · 17265 阅读 · 3 评论 -
【数据结构】(二叉树)求先序遍历序列中第K个结点
算法思想: 其实就是定义一个全局遍历去寻找k值 递归代码为先序遍历代码:int i=0;;void PreNode(BiTree *T,int k){ if(!T){ return ; } i++; if(i==k){ visit(T); //或者返回该节点的值 return ; } PreNode(T->lchild,k); PreNode(T-...原创 2019-07-31 23:26:43 · 16249 阅读 · 4 评论 -
【数据结构】(二叉树)求非空二叉树的宽度 递归&&非递归
求非空二叉树的宽度方法一递归:**算法思想:**当我们看图的时候我们可以知道求二叉树的宽度本质就是求其一层有多少个结点 那么如何用递归的方式去计算每一层结点的个数呢?答案就是:我们只要知道当前结点是那一层就可以利用数组来统计数量了int Max=0;int conut_[MaxSize];void getBiWid(BiTree *T,int k){ //k变量为当前层数 默认从第...原创 2019-08-02 21:04:42 · 14771 阅读 · 3 评论 -
【数据结构】(二叉树)求二叉树带权路径长度(WPL)递归&&非递归
求二叉树带权路径长度(WPL)简介:*树的带权路径长度(Weighted Path Length of Tree,简记为WPL)*二叉树的带权路径长度是每个叶子节点深度(高度)与其指定权重的乘积总和。算法思想:对于求带权路径长度我们只需要找到叶子结点以及叶子结点所在的层数即可,本文将采取递归与非递归两种思路来解题typedef struct BiNode{ int weight;...原创 2019-08-03 20:59:47 · 14404 阅读 · 4 评论 -
【数据结构】(二叉树)判断两棵二叉树是否相似 递归
判断两棵二叉树是否相似简介:判断二叉树是否相似的方法就是:T1,T2都是空树,或者二叉树只有一个根结点,,或者T1与T2的子树是相似的算法思想:递归的思想就是判断把每一个结点看成“根结点”进行操作即可int similar(BiTree *p,BiTree *q){ if(p==NULL&&q==NULL){ return 1; }else if(p==NU...原创 2019-08-03 21:13:35 · 13133 阅读 · 0 评论 -
【数据结构】(二叉树)计算二叉树的高度递归与非递归 三种方法 C语言
递归法求二叉树高度递归法可以理解为一个子问题当一棵树只有左孩子和右孩子的时候我们只需要计算其左孩子的高度和其右孩子的高度并且求的他门两个之间的最大值并且+1即可 这个1就是根节点这样我们就得到了递归代码如下/**计算二叉树的高度 递归法*/int getdepth3(BiTree *t){ if(t!=NULL){ int ldpth=getdepth3(t->lchil...原创 2019-07-31 20:45:13 · 16584 阅读 · 0 评论 -
【数据结构】(二叉树)根据先序和中序唯一确定一颗二叉树
完整代码BiTree* PreInCreate2(char pre[],char in[],int s1,int end1,int s2,int end2){ BiTree *root=(BiTree*)malloc(sizeof(BiTree)); root->data=pre[s1]; int i; for(i=s2;in[i]!=root->data;i++)...原创 2019-07-31 20:33:09 · 9474 阅读 · 0 评论 -
【数据结构】 (二叉树)二叉树的先序中序和后序列遍历 递归&&非递归
递归思想遍历二叉树对于递归思想来说只要把握好子问题就可以了。 因为二叉树中每个结点都会被经历三次,其实先序,中序,后序遍历就对应了第一次经历结点时访问,第二次经历访问,第三次经历访问。显而易见递归代码就写出来了如下//二叉树先序遍历 void preorder(BiTree *b){ if(b!=NULL){ visit(b); preorder(b->lchild); ...原创 2019-07-31 20:57:27 · 9335 阅读 · 0 评论 -
【数据结构】(二叉树 )线索构造二叉树
中序线索二叉树的构造结构体typedef struct TBTNode{ int data; int rtag; int ltag; TBTNode *rchild; TBTNode *lchild;};核心代码/线索二叉树的中序遍历 递归void inThread(TBTNode *p,TBTNode *&pre){ if(p!=NULL){ inT...原创 2019-07-31 21:02:00 · 8853 阅读 · 2 评论 -
【数据结构】(二叉树)判断二叉树是否为完全二叉树
检查二叉树是否为完全二叉树算法思想:检查二叉树是否为完全二叉树思想就是与满二叉树做对比,可知完全二叉树只有最右面是空的。采用层次遍历的方式在入队列的过程中空指针也要进行入队若空指针后面还有非空元素则该二叉树不是完全二叉树结构体typedef struct BiTree{ char data; BiTree *lchild; BiTree *rchild; };代码:in...原创 2019-07-31 22:14:18 · 10562 阅读 · 1 评论 -
【数据结构】(二叉树)递归求解双分支结点个数
算法思想: 求二叉树双分支结点个数就是当一个结点左右孩子非空时该结点为双分支结点//二叉树结构体定义typedef struct BiTree{ char data; BiTree *lchild; BiTree *rchild; }BiTree;int DsonNodes(BiTree *T){ if(!T){ return 0; } if(T->rch...原创 2019-07-31 22:37:24 · 14515 阅读 · 0 评论 -
【数据结构】(二叉树)递归交换二叉树的左右子树
**算法思想:**递归交换二叉树左右子树可以采取先序,中序,后序,遍历的思想,划分子问题对其求解代码:void Swap(BiTree *&right,BiTree *&left){ BiTree *temp=right; right=left; left=temp;}void SwapSubtrees(BiTree *T){ if(!T) return ...原创 2019-07-31 23:02:02 · 11828 阅读 · 4 评论 -
【数据结构】(二叉排序树)查找二叉排序树第k小的结点
算法思想:我是想到了查找第k个结点的办法也就是二叉树查找先序序列第k个结点将其改造为查找中序序列第k个结点即可 int i=0; int min; void Inorder (TreeNode* &root,int k){ if(!root) return; Inorder(root->left,k)...原创 2019-08-17 08:12:58 · 1837 阅读 · 0 评论