zoukankan      html  css  js  c++  java
  • 王彪20162321 2017-2018《程序设计与数据结构》第七周学习总结

    学习目标

    • 理解树抽象数据类型
    • 会用树解决问题
    • 掌握树的遍历方法
    • 掌握二叉树的实现(数组,链表)
    • 会用二叉树表示决策树

    树的基本知识

    1.树

    • 每棵树至多只有一个根节点
    • 根节点生出多个孩子节点,每个孩子节点只有一个父节点每个孩子又生出多个孩子
    • 父亲节点 (parent) 和孩子节点 (child) 是相对的
    • 没有孩子节点的节点成为叶子节点 (leaf)

    节点的度:

    一个节点直接含有的子树个数,叫做节点的度。

    树的度:

    一棵树中 最大节点的度,即哪个节点的子节点最多,它的度就是 树的度。

    节点的层次:

    从根节点开始算起,根节点算第一层,往后至底层。

    树的高度和深度

    树的高度是从叶子节点开始,自底向上增加。与高度相反,树的深度从根节点开始,自顶向下增加。

    2.树的遍历

    根据不同的场景中,根节点,左右子树遍历的顺序,二叉树的遍历分为三种。

    • 先序遍历
    • 中序遍历
    • 后序遍历

    先序遍历:

    • 先访问根节点
    • 再先序遍历左子树
    • 再先序遍历右子树
    • 退出

    代码

        public voic preorder(BinaryTreeNode node){
            if(node == null){
                return;
            }
            //(1)打印出node的data
            //(2)
            preorder(node.getLeft());
            //(3)
            preorder(node.getRight());
        }
    

    中序遍历

    • 先中序遍历左子树
    • 再访问根节点
    • 再中序遍历右子树
    • 退出

    代码

        public void inorder(BinaryTreeNode node){
            if(node == null){
                return;
            }
            //(1)
            inorder(node.getLeft());
            //(2)打印出node
            //(3)
            inorder(node.getRight());
        }
    

    后序遍历

    • 先后序遍历左子树
    • 再后序遍历右子树
    • 最后访问根节点
    • 退出

    代码

        public void postorder(BinatyTreeNode node){
            if(node == null){
                return;
            }
            //(1)
            postorder(node.getLeft());
            //(2)
            postorder(node.getRight());
            //(3)打印出node的data
        }
    

    树的实现

    1.树的数组表示(1)

    • 关键概念:使用数组实现二叉树时,位于位置n的元素的左孩子在(2n+1)的位置,其右孩子在(2(n+1))的位置。

    • 代码【目前未完成】

    2.树的数组表示(2)

    • 关键概念:树的基于数组的储存链实现方式可以占据数组中的连续位置,不管树是不是完全树。这是模仿操作系统内存管理的方法。数组的每个元素是一个对象,他保存指向树中元素的引用及每个子节点所在的数组下标。

    • 代码【目前未完成】

    3.输的链式实现

    • 关键概念:使用一个单独的类来定义树节点,每个节点都包含一个指向节点可能有的子节点的引用,这样做的好处是有助于递归的方式处理树的许多操作。

    • 书中给出的代码LinkedBinaryTree类未实现的方法有:getRigth() , contains() , isEmpty() , toString() , preorder() , postorder() .

    getRight()方法的实现跟getLeft()方法的实现大体一致,都是返回整棵左或右子树,返回值是新构建的LinkedBinaryTree对象。

    public LinkedBinaryTree<T> getRight() {
          if (root==null)
             throw new EmptyCollectionException("Get right operation"+"failed.The tree is empty.");
          LinkedBinaryTree<T> result = new LinkedBinaryTree<>();
          result.root=root.getRight();
          return result;
        }
    

    contains方法调用find方法,返回boolean类型的值,判断是否存在目标元素

    public boolean contains(T target) {
          BTNode<T> node = null;
          if (root!=null)
             node = root.find(target);
          if (node==null)
             return false;
          else return true;
       }
    

    preorder方法是将树进行先序遍历;postorder方法是将树进行后续遍历。

  • 相关阅读:
    Alpha冲刺(1/4)
    团队项目用户验收评审
    beta冲刺 第四天
    beta冲刺 第三天
    Beta冲刺 第二天
    Beta冲刺 第一天
    实验十一 团队作业7---团队项目设计完善&编码测试
    Alpha冲刺四
    Alpha冲刺
    《Miracle_House》团队项目系统设计改进
  • 原文地址:https://www.cnblogs.com/wbiao21/p/7711863.html
Copyright © 2011-2022 走看看