数据结构于JS也可以成为CP(九)Tree

论坛 期权论坛 期权     
萌兔it   2019-7-14 05:53   3005   0
Hello小伙伴们~半周不见
,兔妞今天要继续为大家带来树啦,(小飘一下用个英文标题,哈哈)。树呢,是一种非线性的数据结构,由一组以边连接的节点组成,以分层的方式存储数据。树会被用在哪里呢?树被用来存储具有层级关系的数据以及存储有序列表。还记得是什么样子不?


树的基本概念
根节点:一棵树最上面的节点。
父节点:一个节点下面连接多个节点。
叶子节点:一个节点虾米阿安所连接的节点。
路径:沿着一组特定的边,可以从一个节点走到另一个与它不直接相连的节点。从一个节点到另一个节点的这一组边成为路径。
树的遍历:以某种特定顺序访问树中所有的节点。
键:每个节点都有一个与之相关的值,该值则为键。

二叉树
二叉树又是个啥?这是一种特殊的树,特殊在哪里?它的节点个数不超过两个,这也保证了它的插入、查找、删除效率。那么对于这两个节点又要怎么利用呢?相对较小的值保存在左节点,相对较大的值保存在右节点中。下面就让我们看看二叉树如何实现的吧~树由节点组成,所以首先要创建一个node类来保存数据,我们还要有一个二叉查找树的类,然后要做的就是向类中插入节点咯。
插入节点的过程应该是这样的:
1)设根节点为当前节点。
2)如果待插入节点保存的数据小于当前节点,则设新的当前节点为原节点的左节点;反之,执行第 4 步。
3)如果当前节点的左节点为 null,就将新的节点插入这个位置,退出循环;反之,继续执行下一次循环。
4)设新的当前节点为原节点的右节点。
5)如果当前节点的右节点为 null,就将新的节点插入这个位置,退出循环;反之,继续执行下一次循环。

   

  
  1. function Node(data, left, right) {
复制代码
  1.   this.data = data;
复制代码
  1.   this.left = left;
复制代码
  1.   this.right = right;
复制代码
  1.   this.show = show;
复制代码
  1. }
复制代码
  1. function show() {
复制代码
  1.   return this.data;
复制代码
  1. }
复制代码
  1. function BST() {
复制代码
  1.   this.root = null;
复制代码
  1.   this.insert = insert;
复制代码
  1.   this.inOrder = inOrder;
复制代码
  1. }
复制代码
  1. function insert(data) {
复制代码
  1.   var n = new Node(data, null, null);
复制代码
  1.   if (this.root == null) {
复制代码
  1.       this.root = n;
复制代码
  1.   }
复制代码
  1.   else {
复制代码
  1.     var current = this.root;
复制代码
  1.     var parent;
复制代码
  1.     while (true) {
复制代码
  1.       parent = current;
复制代码
  1.       if (data < current.data) {
复制代码
  1.         current = current.left;
复制代码
  1.         if (current == null) {
复制代码
  1.           parent.left = n;
复制代码
  1.           break;
复制代码
  1.         }
复制代码
  1.       }
复制代码
  1.       else {
复制代码
  1.         current = current.right;
复制代码
  1.         if (current == null) {
复制代码
  1.           parent.right = n;
复制代码
  1.           break;
复制代码
  1.         }
复制代码
  1.       }
复制代码
  1.     }
复制代码
  1.   }
复制代码
  1. }
复制代码
二叉树的遍历
二叉树的遍历大概是面试必问题目了,那么我们就来看看都有什么遍历。中序、先序和后序。他们分别是什么呢?
1)中序遍历:按照节点上的键值,以升序访问BST 上的所有节点。
2)先序遍历先访问根节点,然后以同样方式访问左子树和右子树。
3)后序
遍历先访问叶子节点,从左子树到右子树,再到根节点。
看看怎么实现吧!
1)中序


  1. function inOrder(node) {
复制代码
  1.    if (!(node == null)) {
复制代码
  1.       inOrder(node.left);
复制代码
  1.       putstr(node.show() + " ");
复制代码
  1.       inOrder(node.right);
复制代码
  1.    }
复制代码
  1. }
复制代码
2)先序


  1. function preOrder(node) {
复制代码
  1.    if (!(node == null)) {
复制代码
  1.       putstr(node.show() + " ");
复制代码
  1.       preOrder(node.left);
复制代码
  1.       preOrder(node.right);
复制代码
  1.     }
复制代码
  1. }
复制代码
3)后序

  1. function postOrder(node) {
复制代码
  1.   if (!(node == null)) {
复制代码
  1.      postOrder(node.left);
复制代码
  1.      postOrder(node.right);
复制代码
  1.      putstr(node.show() + " ");
复制代码
  1.   }
复制代码
  1. }
复制代码

   

   

  

   

   

  

二叉树的应用
二叉树介绍完了,让我们看看这种数据结构提供了什么便利。
1)找最大值、最小值:按照二叉树的特点左节点永远是较小值、右节点永远是较大值,那么找最大、最小值是不是就方便很多呢?
2)找特定的数:还是按照二叉树的特性,我们通过判断节点的大小就可以判断顺着哪个分支走下去,那么工作量是不是就少了一半呢?

具体的应用留给小伙伴自己脑补啦~

好啦,今天的分享就到这里啦,有关于二叉树的或者其他的话题想和兔妞聊那就后台留言哦~兔妞在那里等着你!PS:别忘了在看加关注哦~
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:
帖子:
精华:
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP