前言:题图无关,现在开始来学习学习树相关的知识
前序文章:
数据结构与算法(1)——数组与链表(https://www.jianshu.com/p/7b93b3570875)
数据结构与算法(2)——栈和队列(https://www.jianshu.com/p/5087c751cb42)
树 什么是树树是一种类似于链表的数据结构,不过链表的结点是以线性方式简单地指向其后继结点,而树的一个结点可以指向许多个结点;数是一种典型的非线性结构;树结构是以表达具有层次特性的图结构的一种方法;
相关术语根节点:根节点是一个没有双亲结点的结点,一棵树中最多有一个根节点(如上图的结点A就是根节点);
边:边表示从双亲结点到孩子结点的链接(如上图中所有的链接);
叶子结点:没有孩子结点的结点叫作叶子结点(如E、J、K、H和I);
兄弟结点:拥有相同双亲结点的所有孩子结点叫作兄弟结点(B、C、D是A的兄弟结点,E、F是B的兄弟结点);
祖先结点:如果存在一条从根节点到结点q的路径,其结点p出现在这条路径上,那么就可以吧结点p叫作结点q的祖先结点,结点q也叫做p的子孙结点(例如,A、C和G是K的祖先结点);
结点的大小:结点的大小是指子孙的个数,包括其自身。(子树C的大小为3);
树的层:位于相同深度的所有结点的集合叫作树的层(B、C和D具有相同的层,上图的结构有0/1/2/3四个层);
结点的深度:是指从根节点到该节点的路径长度(G点的深度为2,A—C—G);
结点的高度:是指从该节点到最深节点的路径长度,树的高度是指从根节点到书中最深结点的路径长度,只含有根节点的树的高度为0。(B的高度为2,B—F—J);
树的高度:是树中所有结点高度的最大值,树的深度是树中所有结点深度的最大值,对于同一棵树,其深度和高度是相同的,但是对于各个结点,其深度和高度不一定相同;
二叉树如果一棵树中的每个结点有0,1或者2个孩子结点,那么这棵树就称为二叉树;空树也是一颗有效的二叉树,一颗二叉树可以看做是由根节点和两棵不相交的子树(分别称为左子树和右子树)组成,如下图所示。
二叉树的类型严格二叉树:二叉树中的每个节点要么有两个孩子结点,要么没有孩子结点
满二叉树:二叉树中的每个结点恰好有两个孩子结点且所有叶子结点都在同一层
完全二叉树:在定义完全二叉树之前,假定二叉树的高度为h;对于完全二叉树,如果将所有结点从根节点开始从左至右,从上至下,依次编号(假定根节点的编号为1),那么僵得到从1~n(n为结点总数)的完整序列,在遍历过程中对于空指针也赋予编号,如果所有伽椰子结点的深度为h或h-1,且在结点编号序列中没有漏掉任何数字,那么这样的二叉树叫作完全二叉树。
二叉树的应用编译器中的表达式树;
用于数据压缩算法中的赫夫曼编码树;
支持在集合中查找、插入和删除,其平均时间复杂度为O(lognn)的二叉搜索树(BST);
优先队列(PQ),它支持以对数时间(最坏情况下)对集合中的最小(或最大)数据元素进行搜索和删除;
二叉树的遍历访问树中所有结点的过程叫作树的遍历,在遍历过程中,每个结点只能被处理一次,尽管其有可能被访问多次;根据结点处理顺序的不同,。可以定义不同的遍历方法,遍历分类可以根据当前节点被处理的顺序来划分:
前序遍历