php之二叉树
二叉树的特点:
①、每个节点最多有两个子树,所以二叉树中不存在度大于2的节点。注意不是只有两个子树,最多有两个子树,没有子树或者只有一颗子树都是可以的。
②左子树和右子树是有顺序的。
③即使树中只有一颗子树,也要区分它是左子树还是右子树。
二叉树具有五种基本形态。
①、空二叉树。
②、只有一个根节点。
③根节点只有左子树。
④根节点只有右子树。
⑤根节点既有左子树又有右子树。
特殊的二叉树
①斜树
所有的节点都只有左子树的二叉树称为左斜树。
所有的节点都只有右子树的二叉树称为右斜树。
②满二叉树
在一颗二叉树中,如果所有的分支节点都存在左子树和右子树,并且所有的叶子结点都在同一层上,这样的二叉树称为满二叉树。
满二叉树的特点:
1、叶子只能出现在最下面一层。
2、非叶子结点的度一定是2.
3、同样结点的二叉树中,满二叉树中结点个数最多,叶子结点最多
③完全二叉树
完全二叉树的特点:
1、叶子结点只能出现在最下面的两层。
2、最下层的叶子一定集中在左侧连续位置。
3、倒数第二层有叶子结点,一定集中在右侧连续位置。
4、如果某个结点的度是1,则该结点一定只有左孩子。
5、同样结点的二叉树,完全二叉树的深度是最小的。
二叉树的性质
①在二叉树中的第n层,最多2的n-1次方个结点(n>1)。
②在一颗深度为n的二叉树中,最多有2的n次方-1个结点。(n>1)
对于任意一颗二叉树,n0代表叶子结点的个数,n1代表度数为1的节点的个数,n2代表度度数为2的节点的个数。
则由于节点的总个数
n = n0 + n1 + n2
然后根据连接线,计算一颗二叉树的进入线的条数
由于根节点没有分支进入,则总的进入线条数等于n-1,然后根据节点的度计算总的进入线条数为n1+2n2
即n-1 = n1 + n2
根据①式和②式可得n0 = 2n2+1.
③一颗完全二叉树的深度,假设二叉树的深度为h,节点个数为n,
则由于一颗二叉树的节点总个数为2的h次方-1,
最大极端情况是这课完全二叉树是满二叉树,则n小于等于2的h次方-1
最小极端的情况是把这颗完全二叉树的最下层去掉,则n > 2的h-1次方-1
结合这两个式子可得h小于等于log2 n
php之二叉树的更多相关文章
- [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法
二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...
- 二叉树的递归实现(java)
这里演示的二叉树为3层. 递归实现,先构造出一个root节点,先判断左子节点是否为空,为空则构造左子节点,否则进入下一步判断右子节点是否为空,为空则构造右子节点. 利用层数控制迭代次数. 依次递归第二 ...
- c 二叉树的使用
简单的通过一个寻找嫌疑人的小程序 来演示二叉树的使用 #include <stdio.h> #include <stdlib.h> #include <string.h& ...
- Java 二叉树遍历右视图-LeetCode199
题目如下: 题目给出的例子不太好,容易让人误解成不断顺着右节点访问就好了,但是题目意思并不是这样. 换成通俗的意思:按层遍历二叉树,输出每层的最右端结点. 这就明白时一道二叉树层序遍历的问题,用一个队 ...
- 数据结构:二叉树 基于list实现(python版)
基于python的list实现二叉树 #!/usr/bin/env python # -*- coding:utf-8 -*- class BinTreeValueError(ValueError): ...
- [LeetCode] Path Sum III 二叉树的路径和之三
You are given a binary tree in which each node contains an integer value. Find the number of paths t ...
- [LeetCode] Find Leaves of Binary Tree 找二叉树的叶节点
Given a binary tree, find all leaves and then remove those leaves. Then repeat the previous steps un ...
- [LeetCode] Verify Preorder Serialization of a Binary Tree 验证二叉树的先序序列化
One way to serialize a binary tree is to use pre-oder traversal. When we encounter a non-null node, ...
- [LeetCode] Binary Tree Vertical Order Traversal 二叉树的竖直遍历
Given a binary tree, return the vertical order traversal of its nodes' values. (ie, from top to bott ...
- [LeetCode] Binary Tree Longest Consecutive Sequence 二叉树最长连续序列
Given a binary tree, find the length of the longest consecutive sequence path. The path refers to an ...
随机推荐
- linux每日命令(8):mv命令
mv命令是move的缩写,可以用来移动文件或者将文件改名(move (rename) files),是Linux系统下常用的命令,经常用来备份文件或者目录. 一.命令格式: mv [选项] 源文件或目 ...
- rman list命令
rman list命令 List command example 可以用于查看backup,copy,archivelog等 01 list incarnation================ ...
- yum只下载软件不安装的两种方法
1 通过yum自带一个工具:yumdownloader rpm -qa |grep yum-utils yum -y install yum-utils* rpm -ql yum-utils 安装好后 ...
- 【WPF】点击滑动条(Slider),移动滑块(Tick)到鼠标点击的位置
问题:点击Slider控件时,滑块会自动跳到滑动条的最边缘位置,无法跳到鼠标点击的位置上. 办法:给Slider控件设置属性IsMoveToPointEnabled="True"即 ...
- stm32+rx8025
// 设备读写地址 #define RX8025_ADDR_READ 0x65 #define RX8025_ADDR_WRITE ...
- AI金融知识自学偏量化方向-前提1
前提: 统计学习(统计分析)和机器学习之间的区别 金融公司采用机器学习技术及招募相关人才要求 第一个问题: 机器学习和统计学都是数据科学的一部分.机器学习中的学习一词表示算法依赖于一些数据(被用作训 ...
- android 中的一些资源注解,让编译器帮你检查代码
android 中的一些资源注解,让编译器帮你检查代码 写方便的时候可以用注解来声明一些参数,以明确的指示参数的类型,让代码更安全.我们看到,在android源代码里大量使用了注解.我整理了一些注解如 ...
- sql server 获取动态sql输出结果
不带输出结果 我们一般会这样写 例子:一个输出6位递增号码结果 ALTER proc GetCode ), ) as declare @sqlstring nvarchar(max) set @sql ...
- Windows server 2008 R2 多用户远程桌面
1. 创建三个本地管理员测试用户 user01 user02 user03并设置密码 2. 开启远程桌面连接 3.新建规则放行远程桌面端口3389 (或者关闭防火墙) 4.安装远程桌面服务 5 ...
- [Android] 基于 Linux 命令行构建 Android 应用(七):自动化构建
本章将演示如何基于 Linux 命令行构建 Android 应用,在开始本章之前,希望你已经阅读之前几章内容. 本文环境为 RHEL Sandiego 32-bits,要基于 Linux CLI 构建 ...