2020软件工程作业04

这个作业属于哪个课程 2018软件工程3班
这个作业要求在哪里 现代软件工程 作业 第四次博客作业
这个作业的目标 两则算法的理解与实现
其他参考文献 看懂二叉树的三种遍历 二叉树的前中后和层序遍历详细图解(递归和非递归写法)

算法

01.寻找数组中第K大是数

  1. 题目名称:寻找数组中第K大是数 考察算法:排序算法

  2. 解题思路:首先阅读题目,以及示例,可知本题是想使用数组存储数值,然后写出算法按需求进行遍历,取出所需要的的数值。
    1. 定义一个数组,通过Scanner来获取输入,达到自定义序列长度的目的
    2. 给定好数组空间大小后,依次输入序列
    3. 定义一个tag数组,来存储条件
    4. 定义一个getK()方法,通过sort方法进行排序,取出第K大值
    5. 调用方法,实现输出第K大的数

  3. 解题代码

import java.util.Arrays;
import java.util.Scanner;

public class t1 {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		//System.out.println("请给定序列长度");
		int l = input.nextInt();
		int[] a = new int[l];
		//System.out.println("请依次给定序列");
		for (int i = 0; i < a.length; i++) {
			a[i] = input.nextInt();
		}
		//System.out.println("请给定询问个数");
		int n = input.nextInt();

		int[][] tag = new int[n][3];
		//System.out.println("请依次给定:" + " 当前询问次数 " + " 到序列第几个数 " + " 第K大的数 ");
		for (int i = 0; i < n; i++) {
			tag[i][0] = input.nextInt();
			tag[i][1] = input.nextInt();
			tag[i][2] = input.nextInt();
		}
		for (int i = 0; i < n; i++) {
			// 调用getK()方法,输出第K大的数
			//System.out.println("第" + (i + 1) + "次的第K大数为:");
			System.out.println(getMaxK(a, tag[i][0], tag[i][1], tag[i][2]));
		}
                //结束输出流
                System.out.close();
		// 结束输入流
		input.close();
	}

	// 遍历找K
	public static int getK(int[] a, int star, int over, int k) {
		int[] T = new int[over - star + 1];
		for (int i = 0; i < T.length; i++) {
			T[i] = a[star - 1 + i];
		}
                //数组排序——升序
		Arrays.sort(T);
		return T[T.length - k];
	}

}

  1. 运行效果

  2. 算法的时间复杂度与空间复杂度
    时间复杂度:O(n*n*n) 立方阶
    空间复杂度:S(n)=O(f(n))

  3. 实现对数器,验证算法的有效性
    【算法基础】如何验证算法是否正确? 对数器是一把利器。

02.二叉树的先、中、后 序遍历与层级遍历

  1. 题目名称:二叉树的先、中、后 序遍历与层级遍历 考察算法: dfs + bfs搜索算法
  2. 解题思路:参考学习——简书——二叉树遍历(先序、中序、后序)
    三种遍历方法的考查顺序一致,得到的结果却不一样,原因在于:
  • 先序:考察到一个节点后,即刻输出该节点的值,并继续遍历其左右子树。(根左右)

  • 中序:考察到一个节点后,将其暂存,遍历完左子树后,再输出该节点的值,然后遍历右子树。(左根右)

  • 后序:考察到一个节点后,将其暂存,遍历完左右子树后,再输出该节点的值。(左右根)

  1. 解题代码
import java.util.LinkedList;

public class t2 {

    public static void main(String[] args) {
        /*
            作业要求:叉树的先、中、后 序遍历与层级遍历
            自己实现四个方法,main方法中调用,将结果打印到控制台
         */
        /*  二叉树的结构
                     A
                    / \
                   T   6
                  /
                 D
               /   \
              N     5
             / \    /
            B   4  1
                 \
                  9
         */
    	long start = System.currentTimeMillis();
		//要测试的程序或方法
		
        Node root = into();
        // 先序遍历
        A(root);
        System.out.println("以上是先序遍历结果");
        // 中序遍历
        B(root);
        System.out.println("以上是中序遍历结果");
        // 后序遍历
        C(root);
        System.out.println("以上是后序遍历结果");
        // 层级遍历
        D(root);
        System.out.println("以上是层级遍历结果");
        
        long end = System.currentTimeMillis();
		System.out.println("程序运行时间:"+(end-start)+"ms");

    }

    private static void A(Node firstRoot) {
        // TODO 先序遍历
    	if (firstRoot == null) return;
        System.out.print(firstRoot.data + " ");
        A(firstRoot.l);
        A(firstRoot.r);
    	     
    }
    private static void B(Node midRoot) {
        // TODO 中序遍历
    	if (midRoot == null) return;

        B(midRoot.l);
        System.out.print(midRoot.data + " ");
        B(midRoot.r);
    }
    private static void C(Node lastRoot) {
        // TODO 后续遍历
    	if (lastRoot == null) return;

        C(lastRoot.l);
        C(lastRoot.r);
        System.out.print(lastRoot.data + " ");
        
    }

    private static void D(Node levelRoot) {
        // TODO 层级遍历
    	
        LinkedList<Node> list = new LinkedList<>();
        list.add(levelRoot);
        while (! list.isEmpty()){
            Node layer = list.pop();
            if (layer.l != null){
                list.offer(layer.l);
            }
            if (layer.r != null){
                list.offer(layer.r);
            }
            System.out.print(layer.data + " ");
        }
    }

    // 构建一颗树,返回根节点
    private static Node into(){
        Node root = new Node("A");
        Node node1 = new Node("T");
        Node node2 = new Node("D");
        Node node3 = new Node("N");
        Node node4 = new Node("B");
        Node node5 = new Node("6");
        Node node6 = new Node("5");
        Node node7 = new Node("4");
        Node node8 = new Node("9");
        Node node9 = new Node("1");
        root.l = node1;
        node1.l = node2;
        node2.l = node3;
        node2.r = node6;
        node3.r = node7;
        node7.r = node8;
        node6.l = node9;
        node3.l = node4;
        root.r = node5;
        return root;
    }

    // 节点
    static class Node{
        // 数据
        Object data;
        // 左孩子
        Node l;
        // 右孩子
        Node r;

        public Node(){}

        public Node(Object data) {
            this.data = data;
            this.l = null;
            this.r = null;
        }

        public Node(Object data, Node l, Node r) {
            this.data = data;
            this.l = l;
            this.r = r;
        }
    }
}
  1. 运行效果

  2. 算法的时间复杂度与空间复杂度
    时间复杂度:
    空间复杂度:

  3. 实现对数器,验证算法的有效性

 往期博客园作业链接

期数 我的主页
第一期 从蓝天到名利 所有你想要的 都别随风去
第二期 第二次作业 计划与执行
第三期 第三次作业 墨刀
第四期 第四次作业 算法
第五期 第五次作业 产品分析测评
posted @ 2020-10-25 16:05  就是王哥哥  阅读(115)  评论(0编辑  收藏  举报