二叉树

作者: Ag_fronted | 来源:发表于2020-12-11 17:16 被阅读0次

1、新建+各种遍历

//API:
//insert添加一个子树,传值Number
//bulkInsert批量添加子树,传值Array
//showTree返回二叉树对象

class BinaryTree {
  constructor(tree = []) {
    this.root = null; //树根
    this.Node = (key) => {
      //生成一个新的子树
      let _obj = Object.create(null, {});
      _obj.key = key;
      _obj.left = null;
      _obj.right = null;
      return _obj;
    };

    //初始化二叉树
    if (typeof tree === 'number') {
      this.insert(tree);
    } else if (Array.isArray(tree)) {
      this.bulkInsert(tree);
    } else {
      console.error('请输入Number类型或者Array类型的参数');
    }
  }

  insert(key) {
    //添加一个新子树
    let newNode = this.Node(key);
    let _insertNode = (node, newNode) => {
      //判断新二叉树的值和原有节点的值
      if (newNode.key < node.key) {
        if (node.left === null) {
          //判断左节点是否为空
          node.left = newNode;
        } else {
          _insertNode(node.left, newNode);
        }
      } else {
        if (node.right === null) {
          //判断右节点是否为空
          node.right = newNode;
        } else {
          _insertNode(node.right, newNode);
        }
      }
    };

    if (this.root === null) {
      //如果没有根节点,那么把传入的值当根节点
      this.root = newNode;
    } else {
      //如果有根节点,那么把传入的值插到二叉树上
      _insertNode(this.root, newNode);
    }
  }

  bulkInsert(nodes) {
    nodes.forEach((key) => {
      //遍历数组,插入子树
      this.insert(key);
    });
  }

  showTree() {
    //返回二叉树对象
    return this.root;
  }

  inOrderTraverse(fn) {
    //中序遍历,传入一个回调函数
    // 左根右
    let inOrderTraverseNode = (node, callback) => {
      if (node !== null) {
        inOrderTraverseNode(node.left, callback);
        callback(node.key);
        inOrderTraverseNode(node.right, callback);
      }
    };
    inOrderTraverseNode(this.root, fn);
  }

  // 前序遍历非递归实现
  preOrderTraverse() {
    const preOrderTraverseNode = (root) => {
      var arr = [],
        res = [];
      if (root != null) {
        arr.push(root);
      }
      while (arr.length != 0) {
        var temp = arr.pop();
        res.push(temp.key);
        if (temp.right != null) {
          arr.push(temp.right);
        }
        if (temp.left != null) {
          arr.push(temp.left);
        }
      }
      return res;
    };
    return preOrderTraverseNode(this.root);
  }

  preOrderTraverse(fn) {
    //先序遍历,传入一个回调函数
    // 根左右
    let preOrderTraverseNode = (node, callback) => {
      if (node !== null) {
        callback(node.key);
        preOrderTraverseNode(node.left, callback);
        preOrderTraverseNode(node.right, callback);
      }
    };
    preOrderTraverseNode(this.root, fn);
  }

  postOrderTraverse(fn) {
    //后序遍历,传入一个回调函数
    // 左右根
    let postOrderTraverseNode = (node, callback) => {
      if (node !== null) {
        postOrderTraverseNode(node.left, callback);
        postOrderTraverseNode(node.right, callback);
        callback(node.key);
      }
    };
    postOrderTraverseNode(this.root, fn);
  }
}

let nodes = [8, 3, 6, 4, 9, 11, 2, 5, 7];
let binaryTree = new BinaryTree(nodes);
let arr1 = [],
  arr2 = [],
  arr3 = [];

console.log(binaryTree);

binaryTree.inOrderTraverse((key) => {
  arr1.push(key); //中序遍历[2, 3, 4, 5, 6, 7, 8, 9, 11]
});
binaryTree.preOrderTraverse((key) => {
  arr2.push(key); //先序遍历[8, 3, 2, 6, 4, 5, 7, 9, 11]
});
binaryTree.postOrderTraverse((key) => {
  arr3.push(key); //后序遍历[2, 5, 4, 7, 6, 3, 11, 9, 8]
});

console.log(binaryTree, arr1, arr2, arr3);

2、示例

image.png

相关文章

  • 数据结构与算法-二叉树02

    二叉树的定义 二叉树的特点 二叉树的五中基本形态 其他二叉树 斜二叉树 满二叉树 完全二叉树图片.png满二叉树一...

  • 二叉树

    二叉树 高度 深度真二叉树 满二叉树 完全二叉树 二叉树遍历前序 中序 后序层序遍历 翻转二叉树 递归法...

  • 二叉树 基础操作

    二叉树的使用 二叉树结构 先序创建二叉树 DFS 先序遍历二叉树 中序遍历二叉树 后序遍历二叉树 BFS 层次遍历...

  • 树与二叉树

    **树 ** 二叉树 满二叉树 完全二叉树 三种遍历方法 树与二叉树的区别 二叉查找树 平衡二叉树 红黑二叉树

  • 二叉树的宽度优先搜索(层次遍历,BFS)

    二叉树结构: 二叉树宽度优先搜索: 按照二叉树的层数依次从左到右访问二叉树的节点;例如:给定一个二叉树: 按照宽度...

  • 剑指 offer:39、平衡二叉树

    39. 平衡二叉树 题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树。 解题思路: 平衡二叉树:Wiki:在...

  • Algorithm小白入门 -- 二叉树

    二叉树二叉树构造二叉树寻找重复子树 1. 二叉树 基本二叉树节点如下: 很多经典算法,比如回溯、动态规划、分治算法...

  • 14-树&二叉树&真二叉树&满二叉树

    一、树 二、二叉树 三、真二叉树 四、满二叉树

  • 二叉树的应用

    完美二叉树(满二叉树) 除了最下一层的节点外,每层节点都有两个子节点的二叉树为满二叉树 完全二叉树 除二叉树最后一...

  • 12.树Tree(2)

    目录:1.二叉树的基本概念2.二叉树的性质3.二叉树的创建4.二叉树的遍历 1.二叉树的基本概念 2.二叉树的性质...

网友评论

      本文标题:二叉树

      本文链接:https://www.haomeiwen.com/subject/ugajgktx.html