二叉树(Binary Tree)是n(n>=0)个结点的有限集合,该集合或者为空集(空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成。

二叉树的特点

每个结点最多有两棵子树,所以二叉树中不存在度大于2的结点。二叉树中每一个节点都是一个对象,每一个数据节点都有三个指针,分别是指向父母、左孩子和右孩子的指针。每一个节点都是通过指针相互连接的。相连指针的关系都是父子关系。

二叉树节点的定义

二叉树节点定义如下:

struct BinaryTreeNode
{int m_nValue;BinaryTreeNode* m_pLeft;BinaryTreeNode* m_pRight; }; 

二叉树的五种基本形态

空二叉树
只有一个根结点
根结点只有左子树
根结点只有右子树
根结点既有左子树又有右子树

拥有三个结点的普通树只有两种情况:两层或者三层。但由于二叉树要区分左右,所以就会演变成如下的五种形态:

特殊二叉树

斜树

如上面倒数第一副图的第2、3小图所示。

满二叉树

在一棵二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子都在同一层上,这样的二叉树称为满二叉树。如下图所示:

完全二叉树

完全二叉树是指最后一层左边是满的,右边可能满也可能不满,然后其余层都是满的。一个深度为k,节点个数为 2^k - 1 的二叉树为满二叉树(完全二叉树)。就是一棵树,深度为k,并且没有空位。

完全二叉树的特点有:

叶子结点只能出现在最下两层。最下层的叶子一定集中在左部连续位置。倒数第二层,若有叶子结点,一定都在右部连续位置。如果结点度为1,则该结点只有左孩子。同样结点树的二叉树,完全二叉树的深度最小。

注意:满二叉树一定是完全二叉树,但完全二叉树不一定是满二叉树。

算法如下:

bool is_complete(tree *root)
{  queue q;  tree *ptr;  // 进行广度优先遍历(层次遍历),并把NULL节点也放入队列  q.push(root); while ((ptr = q.pop()) != NULL) { q.push(ptr->left); q.push(ptr->right); } // 判断是否还有未被访问到的节点 while (!q.is_empty()) { ptr = q.pop(); // 有未访问到的的非NULL节点,则树存在空洞,为非完全二叉树 if (NULL != ptr) { return false; } } return true; } 

二叉树的性质

二叉树的性质一:在二叉树的第i层上至多有2^(i-1)个结点(i>=1)

二叉树的性质二:深度为k的二叉树至多有2^k-1个结点(k>=1)

二叉树的顺序存储结构

二叉树的顺序存储结构就是用一维数组存储二叉树中的各个结点,并且结点的存储位置能体现结点之间的逻辑关系。

二叉链表

既然顺序存储方式的适用性不强,那么我们就要考虑链式存储结构啦。二叉树的存储按照国际惯例来说一般也是采用链式存储结构的。

二叉树每个结点最多有两个孩子,所以为它设计一个数据域和两个指针域是比较自然的想法,我们称这样的链表叫做二叉链表。

二叉树的遍历

二叉树的遍历(traversing binary tree)是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次且仅被访问一次。

二叉树的遍历有三种方式,如下:

(1)前序遍历(DLR),首先访问根结点,然后遍历左子树,最后遍历右子树。简记根-左-右。(2)中序遍历(LDR),首先遍历左子树,然后访问根结点,最后遍历右子树。简记左-根-右。(3)后序遍历(LRD),首先遍历左子树,然后遍历右子树,最后访问根结点。简记左-右-根。

前序遍历:

若二叉树为空,则空操作返回,否则先访问根结点,然后前序遍历左子树,再前序遍历右子树。


遍历的顺序为:A B D H I E J C F K G

//先序遍历
function preOrder(node){if(!node == null){putstr(node.show()+ " "); preOrder(node.left); preOrder(node.right); } } 

中序遍历:

若树为空,则空操作返回,否则从根结点开始(注意并不是先访问根结点),中序遍历根结点的左子树,然后是访问根结点,最后中序遍历右子树。


遍历的顺序为:H D I B E J A F K C G

//使用递归方式实现中序遍历
function inOrder(node){if(!(node == null)){inOrder(node.left);//先访问左子树 putstr(node.show()+ " ");//再访问根节点 inOrder(node.right);//最后访问右子树 } } 

后序遍历:

若树为空,则空操作返回,否则从左到右先叶子后结点的方式遍历访问左右子树,最后访问根结点。

遍历的顺序为:H I D J E B K F G C A

//后序遍历
function postOrder(node){if(!node == null){postOrder(node.left); postOrder(node.right); putStr(node.show()+ " "); } } 

实现二叉查找树

二叉查找树(BST)由节点组成,所以我们定义一个Node节点对象如下:

function Node(data,left,right){this.data = data;this.left = left;//保存left节点链接 this.right = right; this.show = show; } function show(){ return this.data;//显示保存在节点中的数据 } 

查找最大和最小值

查找BST上的最小值和最大值非常简单,因为较小的值总是在左子节点上,在BST上查找最小值,只需遍历左子树,直到找到最后一个节点

查找最小值

function getMin(){var current = this.root; while(!(current.left == null)){ current = current.left; } return current.data; } 

该方法沿着BST的左子树挨个遍历,直到遍历到BST最左的节点,该节点被定义为:

current.left = null;

这时,当前节点上保存的值就是最小值

查找最大值

在BST上查找最大值只需要遍历右子树,直到找到最后一个节点,该节点上保存的值就是最大值。

function getMax(){var current = this.root; while(!(current.right == null)){ current = current.right; } return current.data; }******************************************************************************************************************************************************************多叉树
void preOrder(tree *root) {printf("%c ",*root->data);if (root->first_child != NULL) { preOrder(root->first_child); } if (root->next_sibling != NULL) { preOrder(root->next_sibling); } } void postOrder(tree *root) { if (root->first_child != NULL) { postOrder(root->first_child); } printf("%c ",*root->data); if (root->next_sibling != NULL) { postOrder(root->next_sibling); } } int main() { tree *root = create(); printf("先序遍历:"); preOrder(root); printf("后序遍历:"); postOrder(root); }
//以下是我的代码function one () {  function xianxu (node) {    if(node!=null) {      color(node);      xianxu(node.firstElementChild);      if(node.id!="first"){    xianxu(node.nextElementSibling);    }}  }  xianxu(first);  time=0;//将定时器的时间改为0}function two () {//后序,多叉树的后序和二叉树中序一样  function zhongxu (node) {    if(node!=null) {      zhongxu(node.firstElementChild);      color(node);      if(node.id!="first"){        zhongxu(node.nextElementSibling);      }}  }  zhongxu(first);  time=0;//将定时器的时间改为0}
 

转载于:https://www.cnblogs.com/handsomeboyyyyyy/p/6838846.html

js二(多)叉树算法相关推荐

  1. 【从蛋壳到满天飞】JS 数据结构解析和算法实现-哈希表

    前言 [从蛋壳到满天飞]JS 数据结构解析和算法实现,全部文章大概的内容如下: Arrays(数组).Stacks(栈).Queues(队列).LinkedList(链表).Recursion(递归思 ...

  2. c语言a 寻路算法,JS/HTML5游戏常用算法之路径搜索算法 A*寻路算法完整实例

    本文实例讲述了JS/HTML5游戏常用算法之路径搜索算法 A*寻路算法.分享给大家供大家参考,具体如下: 完整实例代码如下: A*寻路算法 #stage { border: 1px solid lig ...

  3. 【从蛋壳到满天飞】JS 数据结构解析和算法实现-堆和优先队列(一)

    前言 [从蛋壳到满天飞]JS 数据结构解析和算法实现,全部文章大概的内容如下: Arrays(数组).Stacks(栈).Queues(队列).LinkedList(链表).Recursion(递归思 ...

  4. 使用css3和tween.js二种方式实现照片翻转

    照片翻转的二种方式 最近在学习使用动画效果,经常去鑫空间翻看大神写得博客,最近看到最新3月份出炉的博客–小tips: 在canvas上实现元素图片镜像翻转动画效果,我就想到自己也有需要展示照片的时候, ...

  5. 经典算法研究系列:二、Dijkstra 算法初探

    经典算法研究系列:二.Dijkstra 算法初探  July   二零一一年一月 ====================== 本文主要参考:算法导论 第二版.维基百科. 写的不好之处,还望见谅. 本 ...

  6. 《算法技术手册》一2.4.6 二次方的算法性能

    2.4.6 二次方的算法性能 现在考虑一个类似的问题:两个n位的整数相乘.例2-4展示了使用小学课堂上学过的算法实现的乘法运算,其中n位数字的表示方法与之前的加法一样. 例2-4:mult乘法的Jav ...

  7. 二值化算法OTSU源码解析

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 概述: 本文中小编将会跟大家分享一下OpenCV3.1.0中图像二 ...

  8. 【从蛋壳到满天飞】JS 数据结构解析和算法实现-AVL树(一)

    前言 [从蛋壳到满天飞]JS 数据结构解析和算法实现,全部文章大概的内容如下: Arrays(数组).Stacks(栈).Queues(队列).LinkedList(链表).Recursion(递归思 ...

  9. 十三种基于直方图的图像全局二值化算法原理、实现、代码及效果(转)

    源:十三种基于直方图的图像全局二值化算法原理.实现.代码及效果.

  10. 精通八大排序算法系列:二、堆排序算法

    精通八大排序算法系列:二.堆排序算法 作者:July .二零一一年二月二十日 本文参考:Introduction To Algorithms,second edition. ------------- ...

最新文章

  1. Zookeeper系列(十)zookeeper的服务端启动详述
  2. 4路外线(NAT+PBR真实案例)
  3. 解决nginx重启“var/run/nginx/nginx.pid no such file or directory问题
  4. Android 软键盘的全面解析,让你不再怕控件被遮盖
  5. pandas DataFrame 数据处理常用操作
  6. 论文浅尝 | DSKReG:基于关系GNN的推荐知识图谱可微抽样
  7. php log 行号 debug_backtrace,PHP debug_backtrace() 函数生成 backtrace(回溯跟踪)
  8. 2017.11.18
  9. 根据两点坐标计算两点距离
  10. TwinCAT 3 使用XML-server
  11. 指数函数、对数函数、双曲函数
  12. 李子柒停更半年后,网红经济的“二元一次方程式”解开了吗?
  13. 更改windows7下DOS界面属性的方法
  14. PHP根据字符串拼音首字母进行排序/PHP通讯录按字母A-Z排序
  15. python+xlrd做数字组合
  16. 2023年12306购票平台自动化购票一|解决登录问题
  17. 三角函数π/2转化_高中数学:三角函数的图像和性质归类解析(高考必备)
  18. 用devc++表白_【海大表白墙】lhc,你像夏夜的月光,柔软而清亮。穿梭而过和着一身银辉,望着眼中便多了澄澈与纯粹...
  19. 如何理解IP地址和子网掩码
  20. matlab只能运行两次,[求助]先后两次运行,一次报错一次不报错是为何?

热门文章

  1. Mac下Tomcat乱码的问题
  2. 转载--批量更新数据(性能优化)
  3. ORACLE数据库异步IO介绍
  4. UIButton的resizableImageWithCapInsets使用解析
  5. Open***+ldap配置过程
  6. UNIX高手的10个习惯之一
  7. Python之进程、线程、锁
  8. Maven 梳理 - Maven中的dependencyManagement 意义
  9. 与你邂逅——软件工程
  10. 2016年PMP项目管理知识体系精髓总结