阅读 159

数据结构-树(数据结构树和二叉树知识点总结)

树是一种非线性结构,它对于存储快速查找的元素非常用有用, 树是一种分层数据的抽象模型

  • 树的相关术语

  • 树结构实现

  • 树的遍历

  • 添加和移除节点

树的相关术语

  • 位于树顶部的节点叫作根节点。它没有父节点。

  • 树中的每个元素都叫作节点.节点分为内部节点和外部节点。至少有一个子节点的节点称为内部节点,没有子元素的节点成为外部节点或叶节点。

  • 节点的深度:取决当前节点去祖先节点的数量。

  • 节点的高度:所有节点深度的最大值

二叉树 & 二叉搜索树(BST树)

二叉树中每个节点最多有个节点,一个是左侧节点,一个是右侧节点
二叉搜索树是二叉树特殊分别,只允许你在左侧存储比父节点小数据,右侧节点存储比父节点大数据

BST实现

  • insert(key) 向树插入一个新的键

  • search(key) 在树种搜索key是否存在

  • remove(key) 删除树种特定的值

  • min()  寻找树的最小值

  • max() 寻找树的最大值

  • preOrderTraverse 先序遍历: 先输出当前节点值,在输出左节点,然后右节点值

  • middleOrderTraverse 中序遍历: 先输出左侧节点值,在输出当前节点值,然后右节点值

  • postSequenceTraverse 后续遍历: 先输出左侧节点值,在输出右侧节点值,然后输出当前节点值

  class Node {     constructor(value) {       this.key = value       this.left = null       this.right = null     }   }   class bstTree {     root = null     insert(key) {       const item = new Node(key)       const insertNode = (node, key) => {         if (!node) {           node = item         }         if (node.key - key > 0) {           node.left = insertNode(node.left, key)         } else if (node.key - key < 0) {           node.right = insertNode(node.right, key)         }         return node       }       if (!this.root) {         this.root = item       } else {         insertNode(this.root, key)       }       return true     }     remove(key) {       const removeNode = (node, key) => {         if (!node) {           return null         }         if (node.key - key > 0) {           node.left = removeNode(node.left, key)         } else if (node.key - key < 0) {           node.right = removeNode(node.right, key)         } else {           // 找到目标节点           if (node.left === null && node.right === null) {             node = null           } else if (node.left && node.right === null) {             node = node.left           } else if (node.right && node.left === null) {             node = node.right           } else {             // 目标节点存在左右节点的话, 保持左树不变,取右树最小节点,并且把右树最小节点删除掉             const rightMin = this.minNode(node.right)             node.key = rightMin.key             node.right = removeNode(node.right, rightMin.key)           }         }         return node       }       return removeNode(this.root, key)     }     search(key) {       const searchNode = (node, key) => {         if (!node) {           return undefined         }         if (node.key - key > 0) {           return searchNode(node.left, key)         } else if (node.key - key < 0) {           return searchNode(node.right, key)         } else {           return node         }       }       return searchNode(this.root, key)     }     // 先序遍历     preOrderTraverse() {       let str = ''       const loop = (node) => {         if (!node) {           return         }         str = `${str} => ${node.key}`         loop(node.left)         loop(node.right)       }       loop(this.root)       console.log(str)     }     // 中序遍历     middleOrderTraverse() {       const loop = (node) => {         if (!node) {           return         }         loop(node.left)         console.log(node.key)         loop(node.right)       }       loop(this.root)     }     // 后序遍历     postSequenceTraverse() {       const loop = (node) => {         if (!node) {           return         }         loop(node.left)         loop(node.right)         console.log(node.key)       }       loop(this.root)     }     min() {       if (!this.root) {         return undefined       }       return this.minNode(this.root)     }     minNode(node) {       let current = node       while (current && current.left) {         current = current.left       }       return current     }     max() {       let current = this.root       while (current && current.right) {         current = current.right       }       return current     }   }


作者:levi_m
链接:https://juejin.cn/post/7029614572952649765


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