阅读 107

数据结构—树、二叉树和平衡二叉树(1)

树以及树的基本概念

树结构是一种非线性存储结构,n 个结点组成具有层次关系的有限集合,其中 n >= 0 当 n = 0 时称为空树

存储的是具体一对多的关系的数据元素的集合

  • 结点

  • 根结点

  • 子树

树的性质

  • 有且只有一个根结点,根结点没有父节点

树和链表

  • 链表可以看成树的从根节点触发到叶子节点一个路径

二叉树

  • 非线性数据结构

  • 数据元素(结点)按分支关系组织起来的结构

  • 每个结点最多有两个子树的有序树

满二叉树(perfect binary tree)

叶子节点都在同一层并且除叶子节点外的所有节点都有两个子节点

完全二叉树(complete binary tree)

对于一颗二叉树,如果深度 d (d>1) 除了 d 层外所有节点构成满二叉树,且 d 层所有节点从左向右连续紧密排列

  • 叶子结点只可能在最大的两层出现

  • 对任意结点,如果其右子树的最大层次为 L,则其左子树的最大层次为 L 或者 L+1(子树必须向左对齐)

  • 度为 1 的结点只有 0 或 1 个

完全二叉树性质
  • 叶子节点(度为 0 的结点)

n=n0+n1+n2n = n_0 + n_1 + n_2n=n0+n1+n2 n0=n2+1n_0 = n_2 + 1n0=n2+1

n=2n0+n1−1n = 2n_0 + n_1 - 1n=2n0+n1−1

非完全二叉树

二叉树的存储方式

  • 链式存储(图)

  • 线性存储(图)

二叉树的遍历

BFS(广度优先搜索)
  • 层序遍历

DFS(深度优先搜索)

分别可以用递归法和迭代法来实现前、中或后序实现

  • 前序(中左右)

  • 中序(左中右)

  • 后序(左右中 )

二叉搜索树

二叉搜索对树结构,

字典树

平衡二叉树

一颗空树或者左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一个平衡二叉树,同时,平衡二叉树必定是二叉搜索树

代码实现

function node(value){     return{         value,         children:[],      } } const a = node('a'); const b = node('b'); const c = node('c'); const d = node('d'); const e = node('e'); const f = node('f'); const g = node('g'); const h = node('h'); const i = node('i'); const j = node('j'); const k = node('k'); const l = node('l'); const m = node('m'); a.children.push(b,c,d); b.children.push(e); e.children.push(k,l); c.children.push(f,g,h); h.children.push(m); d.children.push(i,j); 复制代码

//递归函数的参数和返回值 //终止条件 //单层递归的逻辑 const breathFirst = (startNode,cb)=>{     // console.log(startNode)     let queue = [startNode];     // console.log(queue.shift())     while(queue.length>0){         let node = queue.shift();         // console.log(node)         cb(node);         queue.push(...node.children)     } } 复制代码

breathFirst(a,function(node){     console.log(node.value) }) 复制代码

/**  *   * @param {*} node   * @param {*} cb   */ const depthFirstPreOrder = (node,cb)=>{     cb(node);     node.children.forEach(node=>{         depthFirstPreOrder(node,cb)     }) } 复制代码

const depthFirstPostOder = (node,cb)=>{     node.children.forEach(node=>{         depthFirstPostOder(node,cb)     });     cb(node) } // depthFirstPreOrder(a,function(node){ //     console.log(node.value) // }) // depthFirstPostOder(a,function(node){ //     console.log(node.value) // })


作者:ti138729
链接:https://juejin.cn/post/7018861117728374791


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐