首页 > 其他分享 >【二叉树前沿篇】树

【二叉树前沿篇】树

时间:2023-08-20 16:31:56浏览次数:39  
标签:结点 孩子 表示法 兄弟 二叉树 如上图 前沿 节点

1 树的概念

树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。




树有一个特殊的结点,称为根结点,根节点没有前驱结点。

除根节点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、……、Tm,其中每一个集合Ti(1<= i <= m)又是一棵结构与树类似的子树。每棵子树的根结点有且只有一个前驱,可以有0个或多个后继。

 

Tips: 树形结构中,子树之间不能有交集,否则就不是树形结构。

 


2. 树的相关概念



①节点的度:一个节点含有的子树的个数称为该节点的度; 如上图:A的为6。

 

②叶节点或终端节点:度为0的节点称为叶节点; 如上图:B、C、H、I…等节点为叶节点

 

③非终端节点或分支节点:度不为0的节点; 如上图:D、E、F、G…等节点为分支节点。

 

④双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点; 如上图:A是B的父节点。

 

⑤孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点; 如上图:B是A的孩子节点。

 

⑥兄弟节点:具有相同父节点的节点互称为兄弟节点; 如上图:B、C是兄弟节点

 

⑦树的度:一棵树中,最大的节点的度称为树的度; 如上图:树的度为6。

 

⑧节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推。

 

⑨树的高度或深度:树中节点的最大层次; 如上图:树的高度为4。

 

⑩堂兄弟节点:双亲在同一层的节点互为堂兄弟;如上图:H、I互为兄弟节点。

 

⑪节点的祖先:从根到该节点所经分支上的所有节点;如上图:A是所有节点的祖先。

 

⑫子孙:以某节点为根的子树中任一节点都称为该节点的子孙。如上图:所有节点都是A的子孙。

 

⑬森林:由m(m>0)棵互不相交的树的集合称为森林;


3. 树的表示

树结构相对线性表就比较复杂了,要存储表示起来就比较麻烦了,既然保存值域,也要保存结点和结点之间的关系。

实际中树有很多种表示方式如:双亲表示法,孩子表示法、孩子双亲表示法以及孩子兄弟表示法等。我们这里就简单的了解其中最常用的孩子兄弟表示法。


代码实现:


typedef int DataType;

struct Node

{

 struct Node* _firstChild1; // 第一个孩子结点

 struct Node* _pNextBrother; // 指向其下一个兄弟结点

 DataType _data; // 结点中的数据域

};




4. 树在实际中的运用(表示文件系统的目录树结构)



上述中,首先找到第2行的第一个孩子bin,bin在通过兄弟节点找到第二行其他兄弟节点。

又因为第2行第一个节点的孩子指针为空,所以结束不在向下访问。

接下来就是第2行第2个节点通过孩子指针找到第3行第1个节点,然后在通过兄弟节点找到其他兄弟节点。

其他节点不断重复上述过程,最后找到所以数据。



标签:结点,孩子,表示法,兄弟,二叉树,如上图,前沿,节点
From: https://blog.51cto.com/u_16121555/7162401

相关文章

  • 万字长文彻底搞懂二叉树
    算法是面试考察的重点,数据结构是算法的根基。今天主要和大家探讨下数据结构中的二叉树,当然也不仅限于二叉树,还有其他类型的扩展。1基础知识一棵树由称作跟的节点r以及0个或多个非空的树T1,T2,...Tk组成,这些子树中每一颗的根都被来至根r的一条有向的边所连接。深度:对任意......
  • 力扣101. 对称二叉树
    给你一个二叉树的根节点 root ,检查它是否轴对称。 示例1:输入:root=[1,2,2,3,4,4,3]输出:true 示例2:输入:root=[1,2,2,null,3,null,3]输出:false  提示:树中节点数目在范围 [1,1000] 内-100<=Node.val<=100 康复训练1/*2*@lcapp=......
  • 剑指 Offer 55 - I. 二叉树的深度(简单)
    题目:classSolution{public:voidtraversal(TreeNode*cur,int&max,intdepth){//max用来记录最长路径长度,depth记录当前路径长度if(!cur)return;depth++;if(depth>max)max=depth;traversal(cur->left,max,depth);......
  • 合并二叉树
    力扣(LeetCode)官网-全球极客挚爱的技术成长平台经验1:程序写在递归函数前面代表压栈的时候实现,也就是说浏览到这个结点的时候实现程序写在递归函数后面代表弹栈的时候实现,也就是下一次递归结束后在本次递归函数中实现那么到底是压栈的时候实现还是弹栈的时候实现呢,这要看对根......
  • 剑指 Offer 34. 二叉树中和为某一值的路径
    dfsclassSolution{public:vector<vector<int>>res;vector<int>tmp;voiddfs(TreeNode*node,inttarget){if(node==nullptr)return;target-=node->val;tmp.emplace_back(node->val);......
  • 判断是否为完全二叉树
    利用层次遍历思想,但结点是否为空不影响入队。当出队时,该结点为空,若队列中仍有不为空的结点,则不是完全二叉树空树也是完全二叉树#include<stdio.h>#include<stdlib.h>#defineMaxSize100typedefstructNode{intdata;structNode*lchild,*rchild;}TreeNode......
  • 【剑指Offer】61、序列化二叉树
    【剑指Offer】61、序列化二叉树题目描述:请实现两个函数,分别用来序列化和反序列化二叉树。解题思路:序列化是指将结构化的对象转化为字节流以便在网络上传输或写到磁盘进行永久存储的过程。反序列化是指将字节流转回结构化的对象的过程,是序列化的逆过程。受第4题:重建二叉树的启......
  • 平衡二叉树
    110.平衡二叉树-力扣(LeetCode)确定思路如果左右子树都是平衡二叉树,并且左右子树的高度相差不超过1,那么就是平衡二叉树,如果左子树不是平衡二叉树也就不用对右子树进行递归了确定终止条件应该是遍历到叶子节点,因为叶子节点不能构成二叉树了,因为就没有再往下遍历的必要了——......
  • 剑指 Offer 07. 重建二叉树(中等)
    题目:classSolution{//本题思路:利用中序遍历,从前序遍历中找到左、右子树的根节点public:unordered_map<int,int>dic;//创建字典,映射当前根节点在中序遍历中的位置,以便于划分当前根节点的左右子树vector<int>preorder;//即下面的this->preorder......
  • [代码随想录]Day20-二叉树part09
    题目:669.修剪二叉搜索树思路:遍历到的值小于最小值,说明左子树里的所有节点都小于最小值,舍弃左子树。遍历到的值大于最大值,说明右子树里的所有节点都大于最大值,舍弃右子树。如果在范围内,就拼接左右子树然后返回节点代码:/***Definitionforabinarytreenode.*typeTr......