C语言实现二叉树的基本操作 导读 大家好,很高兴又和大家见面啦!!! 在上一篇内容中,咱们详细介绍了二叉树的三种遍历算法以及算法的递归与非递归之间的转换。...在今天的内容中我们将会继续介绍二叉树的一些基本操作如二叉树的层次遍历、求二叉树的深度、求二叉树的结点总数、求二叉树第K层的结点数、求二叉树的叶结点数……以及如何通过C语言来实现这些基本操作。...l + 1 : r + 1;//返回左右子树深度的最大值+1 } 可以看到当我们在求二叉树的深度时,我们将其拆分成了求左子树的深度和右子树的深度,这种将问题拆分的思路是算法中的分治思想,目前我们先简单的了解一下...3.3 求二叉树叶结点数 二叉树中的叶结点指的是其左右子树都为空树的结点,我们要求一棵二叉树中的叶结点数,肯定是需要遍历整棵二叉树,因此求叶结点数的实现也是有多种方式,这里我们还是介绍层序遍历与递归两种方式...在下一篇内容中,我们将会介绍如何通过C语言实现一棵二叉树,大家记得关注哦!!!最后感谢各位朋友的支持,咱们下一篇再见!!!
每一个结点,我们可以用Java语言这样实现: /** * 二叉树结点 */ public class TreeNode { public char value; /** * 左子树...我们可以用Java语言这样实现: public void preOrder(TreeNode biTree) { if(biTree.left !...我们可以用Java语言这样实现: public void preOrder(TreeNode biTree) { if(biTree.left !...已知前中序遍历顺序,求后序遍历顺序 扯了这么多,还是回到刚刚的第一道面试题上: 已知二叉树的前序遍历顺序为ABCDEGHF,中序遍历顺序为DBAGEHCF,求该二叉树的后序遍历。...H)肯定为E的右子树,可以最终判断出二叉树是这样的: 写出后序遍历顺序 这个步骤就比较容易了,根据二叉树得到的后序遍历顺序就是:DBGHEFCA 已知中后序遍历顺序,求前序遍历顺序 扯了这么多,还是回到刚刚的第一道面试题上
DBAGEHCF,求该二叉树的后序遍历。...每一个结点,我们可以用Java语言这样实现: /** * 二叉树结点 */ public class TreeNode { public char value; /** * 左子树...我们可以用Java语言这样实现: public void preOrder(TreeNode biTree) { if(biTree.left !...已知前中序遍历顺序,求后序遍历顺序 扯了这么多,还是回到刚刚的第一道面试题上: 已知二叉树的前序遍历顺序为ABCDEGHF,中序遍历顺序为DBAGEHCF,求该二叉树的后序遍历。...写出后序遍历顺序 这个步骤就比较容易了,根据二叉树得到的后序遍历顺序就是:DBGHEFCA 已知中后序遍历顺序,求前序遍历顺序 扯了这么多,还是回到刚刚的第一道面试题上: 已知二叉树的中序遍历顺序为DBAGEHCF
root; while(c){ pa=c; if(c->data>p->data) c=c->left; else c=c->right; } if(pa->data>p...pa->right=p; } return root; } void print(BTNode *root){ BTNode **Q; //创建一个容量为N的队列来存储完全二叉树的节点...*pa; while(c){ //若有左子女,左子女入队列,若有右子女则右子女入队列 if(c->left) Q[rear++]=c->left; if(c->right) Q...[rear++]=c->right; printf(“%d “,c->data); //更新当前根节点 c=Q[front++]; } } void Forder(BTNode *...{ //-100表示不存在的节点 int a[N]={5,4,6,8,2,9,7,3}; BTNode *root; root=CreateTree(a); //栈实现完全二叉树的前序遍历
输入的数n不能被2-(n-1)整除,说明是素数 输入的数n能被2-(n-1)整除,说明不是素数
素数又叫做质数(prime number),指的是在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数,否则称为合数。合数除了1和这个数本身,还能被其他...
主要用的是二叉树 二叉树 现实中的二叉树 这还是个满二叉树 概念 与普通的树最大的不同是它最多只有两个子树。 特殊的二叉树 满二叉树:每一层都是满的。...搜索二叉树:任何一棵树,左子树都比跟要小,右子树都比根要大。在搜索树中查找一个数,最多查找高度次。时间复杂度O(N)。 引申:左右两边的结点数量比较均匀。...n0,度为2的分支结点个数为n2,则有n0 = n2 +1(度为2的结点个数总是比度为0的结点个数多1) 4.若规定根节点的层数是1,具有n个结点的满二叉树的深度是h = log2 N +1(以2为底N...二叉树顺序存储在物理上是一个数组,在逻辑上是一颗二叉树。 链式存储 二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。...构成&遍历 任何一个二叉树由三个部分构成 1.根节点——2.左子树——3.右子树 分治算法:分而治之,大问题分成子问题,子问题再分成子问题,直到无法分割 前序遍历:根左右—— (上图:A-B-D-NULL-NULL-E-NULL-NULL-C-NULL-NULL
目录 线索二叉树概念 ——普通二叉树缺点 ——中序线索二叉树 ——先序线索二叉树 ——后序线索二叉树 —— 三种线索二叉树的比较 二叉树的线索化 普通方法代码 中序线索化代码 先序线索化代码 后序线索二叉树代码...---- 线索二叉树概念 ——普通二叉树缺点 1、普通二叉树在遍历的时候必须从根节点出发,不能从其中某一点开始遍历。...2、普通二叉树不能快速的找到某个结点的前驱。...n个结点的二叉树,有n+1个空链域!...和上同理 ——后序线索二叉树 和上同理 —— 三种线索二叉树的比较 ---- 二叉树的线索化 用土方法找到中序遍历前驱 普通方法代码 //辅助全局变量,用于查找p的前驱 BiTNode *
先简单介绍一下二叉树,这个词熟悉又陌生,通过字面了解就是每一个结点如果有叉,那最多只能有2个分支,这两个分支就叫做左子树和右子树。...左子树和右子树是有顺序的,即使只有一棵子树也要区分是左子树还是右子树。...typedef struct TreeNode { int data; struct TreeNode* lchild; struct TreeNode* rchild; }TreeNode; 2.创建一棵树...: void midOrder(TreeNode* t) { if (t == NULL) return; else { preOrder(t->lchild); printf("%c"...D:\VS\树\x64\Debug\树.exe (进程 20120)已退出,代码为 0。
BC的父节点是A 堂兄弟:D的堂兄弟是EF 根据上面的概念和上面对树的定义你应该知道这是一个二叉树。...由于二叉树的广泛应用与研究,所以这里我们讨论二叉树,其实森林和一般树都可以转化为一个一般树,转换原则就是把一个节点的第一个子节点变成二叉树的左节点,然后其他堂兄弟就是右节点,这句话不指望你能看懂,因为我都感觉没有表述清楚...,我认为这个视频讲得比较好http://pan.baidu.com/s/1i3yYd2t 然后我们再细分二叉树,它分为: 空二叉树:就是什么都没有 满二叉树:每个节点都有两个子节点 完全二叉树:把一颗完全二叉树的最后一层从右往左删除一些节点得到的就是完全二叉树...二叉树也分顺序存储和链式存储,因为顺序存储比较浪费内存,所以这里考虑用链式存储实现 struct node{ char data; struct node *lchild; struct node...接下来就是中序遍历,中序遍历就是先遍历左节点,然后遍历根,最后右节点,所以遍历顺序就是DBAGECF 最后是后序遍历,后序遍历是先遍历左节点然后右节点最后根,所以遍历顺序是DBGEFCA 这里看似很麻烦,但是如果我们用代码写其实很简单
BT* Create_tree()// 创建二叉树 { BT *bt; char x; scanf("%c",&x); getchar(); if (x ==...); bt->r_chrild = Create_tree(); } return bt; } 先序遍历二叉树:思路, 当二叉树不为空时 访问根节点 遍历根节点左子树...node_num(bt->r_chrild, node); } } 求二叉树深度: 这个一定要好好想想 思路: 从二叉树的根节点开始: 若二叉树根节点为空,返回0, 否则: 递归统计左子树的深度...递归结束,返回左右子树深度的较大值,即二叉树的深度 int tree_depth(BT *bt) // 二叉树深度,就是最大层数 { int l_dep, r_dep; //定义两个变量,存放左...,又称翻转二叉树: // 就是所有节点对换, 也可以用非递归用栈实现,与此类似 //这里是递归实现 void reversal(BT *bt) // 镜像二叉树 { BT *p; if
力扣 572 另一棵树的子树 题目描述 给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。...二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。...[1, 2000] subRoot 树上的节点数量范围是 [1, 1000] -104 <= root.val <= 104 -104 <= subRoot.val <= 104 思路分析 和相同二叉树是一个道理...,但有一个情况:当根节点相同时,我们还得去比较所匹配子树的左右结点,而且会存在根节点不相同的情况,就需要去到左右结点去找,直到找到相同的。...* struct TreeNode *right; * }; */ bool check(struct TreeNode* q, struct TreeNode* p) {//借用相同二叉树的功能
树是数据结构中一门很重要的数据结构,在很多地方都能经常见到他的面孔,比如数据通信,压缩数据等都能见到树的身影。但是最常见的还是相对简单的二叉树,二叉树和常规树都可以进行相互转换。...所以,二叉树的操作必不可少。我这里来简单介绍一下。 在数据结构中给的树和图中,我们最好使用递归来进行各种操作,会让代码更清晰易懂,代码也会更简洁。...层次遍历二叉树 void levelorder(BiTree T) { //用一个队列保存结点信息,这里的队列采用的是顺序队列中的数组实现 int front = 0; int rear = 0;...n", tempNode->data); } } } 复制树 将二叉树复制给另一个二叉树 void copybitree(BiTree T, BiTree *newT) { if (T ==...交换一颗二叉树的左右子树 void exchange(BiTree T) { BiTree p; if (T !
二叉树的层序遍历即从上到下,在每一层从左到右依次打印数据。...如下: 层序遍历结果: ABCDEFG 基本思路即将根节点入队后,之后每次都将队首元素出队,打印队首元素数据,并将队首元素左右子树入队,一直重复上述过程。 自然,本题还可以用数组来实现。...BiTree data[QueueMax]; int head; int rear; int len; }Queue; BiTree CreateTree(); //建立二叉树...BiTree T; T = CreateTree(); LayerOrder(T); return 0; } BiTree CreateTree() { //建立二叉树...char c; c = getchar(); BiTree T; if (c == '#') { return NULL; }
二叉查找树,也称作二叉搜索树,有序二叉树,排序二叉树,而当一棵空树或者具有下列性质的二叉树,就可以被定义为二叉查找树: 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值。...若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值。 任意节点的左、右子树也分别为二叉查找树。 没有键值相等的节点。...二叉查找树相比于其他数据结构的优势在查找、插入的时间复杂度较低,为O(log n)。二叉查找树是基础性数据结构,用于构建更为抽象的数据结构,如集合、multiset、关联数组等。...("中序遍历二叉树: \n"); InorderTravel(T); printf("后序遍历二叉树: \n"); PostorderTravel(T); printf...127's left child 前序遍历二叉树: 21 2150 127 121 中序遍历二叉树: 21 121 127 2150 后序遍历二叉树: 121 127 2150 21 最大值: 2150
小堆 小堆的结构与初始化 堆的销毁,空判定,打印 插入,删除 小堆的结构与初始化 小堆的结构是子节点不小于父节点,兄弟结点没有顺序,并且总是完全二叉树。...逻辑结构是这样的: 物理储存我们用顺序表来储存: 首先从结点的祖先10开始,放进顺序表中,然后是他的子节点15和20,再往下访问也是访问15和20的子节点,分别是30,20,25,90,按照这个规律放进顺序表中就可以了
C语言实现二叉树 导读 大家好,很高兴又和大家见面啦!!! 经过前面两篇内容的介绍,我相信大家对二叉树的基本操作已经比较熟悉了,并且能够自己通过C语言来实现这些基本操作。...那么为了弥补这个遗憾,在今天的内容中,我们将通过C语言来实现一棵二叉树,并对前面介绍的这些基本操作进行相应的测试。...3.2.2 通过C语言实现结点序列构建二叉树 当我们需要通过C语言来构建一棵二叉树时,我们获取的结点序列可能与手算时有些许不同,比如先序序列"ABD##E#H##CF##G##"在这个序列中#代表的是空结点...,这些字符代表的才是二叉树中对应的结点,因此我们不难得出该二叉树的形态: 在这种情况下我们如果要通过C语言来实现的话可以通过先序遍历的方式来创建二叉树,代码如下所示: //二叉树的创建 BTN* BTCreat...五、基本操作的测试 现在我们已经完成了创建和销毁两个基本操作了,接下来就可以通过创建二叉树后进行遍历、求树的深度、求总结点数、求第K层的结点数、求叶子结点数等功能的测试了。
图片 个人主页: 是店小二呀 C语言笔记专栏: C语言笔记 C++笔记专栏: C++笔记 初阶数据结构笔记专栏: 初阶数据结构笔记 喜欢的诗句:无人扶我青云志 我自踏雪至山巅 一、快速搭建二叉树...二叉树大致分为两种 空树 非空:根节点,的左子树,右子树(左右子树可能为空树) 从概念中可以看出来,根据不同节点可以划分多个子树,对此二叉树定义是递归式的,因此后续基本操作都是按照概念实现的。...尝试下前序/中序/后序,写出访问顺序(空也会访问,用N代表) 前序:123NNN45NN6NN 中序:N3N2N1N5N4N6N 后序:NN3N2NN5NN641 过程解析: 达到1号节点为根,访问左子树...使用场景:判断是否为完全二叉树(C++代码)。...4.3 求这个棵树的高度 过程解析:这里也是使用了分治的思想,求整棵树高度分为求左右子树高度之间最大的高度再+1 瑕疵版本: int TreeHeight(TreeNode* root) { if (
用递归方法求阶乘n!...C语言实现代码如下: #include int main() { long fac( int n ); int n, y; printf( "Please input
前言: 链式二叉树我们在C语言阶段已经实现了,这里介绍的是涉及到的部分问题,比如求树的高度,求树的节点个数等,连接部分就手动连接,用一个样例来介绍涉及到的几个问题。...1 链式二叉树的创建 因为是链式二叉树,所以有两个指针,分别指向右孩子节点和左孩子节点,给上值,手动连接即可: typedef struct TreeNode { struct TreeNode* left...node4->left = node5; node4->right = node6; //node5->left = node7; return node1; } 整体构建出来就是这样,对于初学链式二叉树的同学来说...树的节点个数是一样的,求总节点个数,我们可以把树分为左右子树,把一个树拆分成无数的左右子树,统计每个左右子树的节点个数,相加即可。...,也就是说会重复计算,这里不要小看重复计算,没有记录那么所有的计算都会翻二倍,而每一层都没有记录,所有越往层数多的走,就会变成2^n的重复计算,是指数量级的增长,所以我们应该记录数据: size_t TreeHeight
领取专属 10元无门槛券
手把手带您无忧上云