zoukankan      html  css  js  c++  java
  • 二叉树的生成和遍历

    二叉树是一种树状结构的图。它由一系列节点和边组成。

    每个节点的字节点数不超过2个,只有一个根结点。

    基础名词解释

    度: 每个节点的字节点的个数。如图:每个节点的度都是2。如果某个节点有一个字节点,那么它的度是1。

    根节点: 一棵树最上面的节点;一棵树只有一个根节点。

    叶子节点: 没有字节点的节点。图中最下面的8个节点都是叶子节点。

    高度: 树的层数。图中树的高度是3。

    深度: 节点所处的深度;叶子节点的深度等于树的高度;根结点是深度0, 依次类推,字节点是深度1...

    内部节点: 除了叶子节点以外的节点。图中除了最下面的8个叶子节点之外的7个节点都是内部节点。包含根结点。

     树的分类

    满二叉树: 满二叉树要求高度为h的二叉树总节点数为2**(n+1)-1的。上面的示意图是个满二叉树。

    完全二叉树: 完全二叉树只要求从1-n的节点排布同满二叉树。

     二叉查找树: 对于所有的节点来说,当前节点的左子树的所有节点的值比当前节点的值要小;

    所有右子树的值比当前节点的值要大。下图是个查找二叉树。

     二叉查找树遍历方式

    中序遍历: 即按照数据升序遍历。按照左子节点,父结点,右子节点的顺序遍历。

    然后对于根节点来说,左右子节点本身又是个二叉查找树,需要递归调用,直到叶子节点为止。

    叶子节点相当于左右子节点都是null的节点。

    先序遍历:按照根结点,左子树,右子树的顺序遍历。

    后序遍历:按照左子树,右子树,根结点的顺序遍历。

    使用代码实现如下:

    <!--
     * @Author: LyraLee
     * @Date: 2019-10-30 08:53:28
     * @LastEditTime: 2019-11-04 11:57:19
     * @Description: 二叉树的生成和遍历方法
     -->
    <!DOCTYPE html>
    <html lang="en">
      <head>
          <meta charset="UTF-8">
          <meta name="viewport" content="width=device-width, initial-scale=1.0">
          <meta http-equiv="X-UA-Compatible" content="ie=edge">
          <title>二叉树的生成和遍历方法</title>
      </head>
      <body>
        <script type="module">
          // 节点的构造函数
          function Node(data, left, right) {
            this.data = data;
            this.left = left;
            this.right = right;
          }
          // 二叉树向某节点插入数据--向某个父节点的左子节点或者右子节点插入数据
          function insert (data) {
            let newNode = new Node(data, null, null);
            if (this.root === null) {
              this.root = newNode;
            } else {
              let current = this.root;
              let parent; 
              while(true) { //从根节点查找,循环查找需要插入的位置
                let parent = current;
                if (current.data > data) {
                  current = current.left;
                  if (current === null) {
                    parent.left = newNode; //插入成功
                    break;
                  }
                } else {
                  current = current.right;
                  if (current === null) {
                    parent.right = newNode; // 插入成功
                    break;
                  }
                }
              }
            }
          }
          // 二叉查找树的构造函数
          function BST() {
            this.root = null; //根节点
            this.insert = insert;
            this.inOrder = inOrder;
            this.preOrder = preOrder;
            this.postOrder = postOrder;
          }
          // 中序遍历--升序--左->根->右
          let arrIn = [];
          let inOrder = function(node) {
            if (node !== null) {
              inOrder(node.left);
              arrIn.push(node.data);
              inOrder(node.right);
            }
          }
          // 先序遍历--根->左->右
          let arrPre = [];
          let preOrder = function(node) {
            if (node !== null) {
              arrPre.push(node.data);
              preOrder(node.left);
              preOrder(node.right);
            }
          }
          // 后续遍历--左->右->根
          let arrPost = [];
          let postOrder = function(node) {
            if (node !== null) {
              postOrder(node.left);
              postOrder(node.right);
              arrPost.push(node.data);
            }
          }
          let data = [56,28,78,20,35,68,88,10,25,30,45,80,89];
          const bst = new BST();
          data.forEach(i => bst.insert(i))
          bst.inOrder(bst.root);
          console.log('inOrder-->',arrIn);
          bst.preOrder(bst.root);
          console.log('preOrder-->',arrPre);
          bst.postOrder(bst.root);
          console.log('postOrder-->',arrPost);
        </script>
      </body>
    </html>

    运行结果如下:

     // 运行结果如下:  
     inOrder-->[10, 20, 25, 28, 30, 35, 45, 56, 68, 78, 80, 88, 89]
     preOrder-->[56, 28, 20, 10, 25, 35, 30, 45, 78, 68, 88, 80, 89]
     postOrder-->[10, 25, 20, 30, 45, 35, 28, 68, 80, 89, 88, 78, 56]
  • 相关阅读:
    日期格式图片在转换整个输入字符串之前结束
    查看Oracle的表中有哪些索引
    Oracle 中删除表后,表的索引,授权,同义词 会自动删除吗?
    Android自定义进度条颜色
    Android 属性动画(Property Animation) 完全解析 (上)
    开源项目地址
    Android Studio如何设置代码自动提示
    Android Studio 三种添加插件的方式,androidstudio
    强烈推荐android studio用的几个插件
    android studio 中的编码问题
  • 原文地址:https://www.cnblogs.com/lyraLee/p/10518955.html
Copyright © 2011-2022 走看看