20202307 实验八《树》实验报告

20202307 2021-2022-1 《数据结构与面向对象程序设计》实验八报告

课程:《程序设计与数据结构》
班级: 2023
姓名: 范宇涵
学号:20202307
实验教师:王志强
实验日期:2021年11月25日
必修/选修: 必修

实验内容

  1. 参考教材PP16.1,完成链树LinkedBinaryTree的实现(getRight,contains,toString,preorder,postorder)
    用JUnit或自己编写驱动类对自己实现的LinkedBinaryTree进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息
    课下把代码推送到代码托管平台

  2. 基于LinkedBinaryTree,实现基于(中序,先序)序列构造唯一一棵二㕚树的功能,比如给出中序HDIBEMJNAFCKGL和后序ABDHIEJMNCFGKL,构造出附图中的树
    用JUnit或自己编写驱动类对自己实现的功能进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息
    课下把代码推送到代码托管平台

  3. 自己设计并实现一颗决策树
    提交测试代码运行截图,要全屏,包含自己的学号信息
    课下把代码推送到代码托管平台

  4. 输入中缀表达式,使用树将中缀表达式转换为后缀表达式,并输出后缀表达式和计算结果(如果没有用树,正常评分。如果用到了树,即使有小的问题,也酌情给满分)
    提交测试代码运行截图,要全屏,包含自己的学号信息

实验过程及结果

LinkedBinaryTree

实验过程中遇到的问题及解决过程

  • 问题1:总结一下现在学会的造树方法&tips:
  • 问题1解决方案:
  1. 递归造树时,使用数组自增a[i++]。
  2. 非递归造树时,根据需求定义多个add方法,填充空树。
  3. 树的实现具体靠链式结构还是数组结构视情况而定。有些时候通过数组下标访问会更快。比如数组下标为n的左右子树下标分别为2n及2n+1.
  4. 有些树需要借助其他数据类型构造。比如根据前序、中序、后序表达式构造一棵树,需要用到栈。
  5. 大多数情况下还是用递归造树,造了这么多树,虚空结点的树我觉得比较典型,造树代码如下:
    public Tree(String str) {
        StringTokenizer stringTokenizer = new StringTokenizer(str);
        String[] a=new String[20];
        int j=0;
        while (stringTokenizer.hasMoreTokens()) {
            a[j++]= stringTokenizer.nextToken();
        }
        //一定要把root换成create后的root
        root=CreateTree(root,a);
    }
//建立虚空结点的树
    public Node CreateTree(Node x,String[] data) {
        String temp=data[i++];
        if (temp.equals("#"))
            return null;
        else{
            x=new Node(temp);
            x.setLeft(CreateTree(x.getLeft(),data));
            x.setRight(CreateTree(x.getRight(),data));
        }
        return x;
    }
  • 问题2:前序遍历的递归和非递归算法总结
  • 问题2解决方案:
  1. 递归算法
void PreOrder(const TreeNode *root)
{
    if (root == NULL)                 //若结点为空
    {
        printf("# ");
        return;
    }
    printf("%c ", root->data);        //输出根节点的值
    PreOrder(root->left);             //前序访问左子树
    PreOrder(root->right);            //前序访问右子树
}
  1. 非递归方法
void PreOrderLoop(TreeNode *root)
{
    std::stack<TreeNode *> s;
    TreeNode *cur, *top;
    cur = root;
    while (cur != NULL || !s.empty())
    {
        while (cur != NULL)
        {
            printf("%c ", cur->data);
            s.push(cur);
            cur = cur->left;
        }
        top = s.top();
        s.pop();
        cur = top->right;
    }
}

其他(感悟、思考等)

树的结构在算法中使用非常普遍,也非常实用。它既可以用于日常生活中的分类讨论,也可以用于机器学习,通过决策树构建预测模型,推测可能的结果,帮助人们更好的决策。关于树的奥秘和用法,我将在今后的学习中不断探索。

参考资料

posted @ 2021-11-28 21:09  20202307范宇涵  阅读(37)  评论(0编辑  收藏  举报