2020软件工程作业04

|这个作业属于哪个课程 | https://edu.cnblogs.com/campus/zswxy/2018SE/ |
| -- | -- | -- |
|这个作业要求在哪里 | https://edu.cnblogs.com/campus/zswxy/2018SE/homework/11406 |
|这个作业的目标 | 学习算法、数据结构 |
|其他参考文献 | 无 |

一、寻找数组中第K大的数

(1)思路
首先按照题目要求使用Scanner接收数据,在接收时使用Arrays.copyOfRange复制范围内数组的函数,再自己创建一个获取方法。
该方法调用java现有快速排序方法

(2)代码

import java.util.Arrays;

import java.util.Scanner;

public class KNumber {

public static void main(String[] args) {

    Scanner sc = new Scanner(System.in);

    int n = sc.nextInt();//序列长度

    int[] a = new int[n];//定义序列,长度是0到n-1

    for (int i = 0; i < n; i++) {
        int number = sc.nextInt();//输入序列
        if (number <= Math.pow(10, 6)) {
            a[i] = number;
        }

    }
    int m = sc.nextInt();//表示询问m个数
    int begin, end, k;  //开始从第l个数到第r个数

    for (int i = 0; i < m; i++) {//表示接下来输入的三个数
        begin = sc.nextInt();//第m行第1个数
        end = sc.nextInt();
        k = sc.nextInt();
        if (k <= (end - begin + 1)) {
            System.out.print(getMaxk(k, Arrays.copyOfRange(a, begin - 1, end)));
            //使用了Arrays.copyOfRange复制范围内数组的函数
        }

    }

}

public static int getMaxk(int k, int[] arr) {//使用快排
    Arrays.sort(arr);
    return arr[arr.length - k];
}

}

(3)测试

二、二叉树的先、中、后 序遍历与层级遍历
(1)思路
先序:采用递归,根-> 左-> 右
中序:采用递归,左-> 根-> 右
后序:采用递归,左-> 右-> 根
层级:从根节点往下一层一层的访问,每一层从左往右访问
(2)代码

import java.util.LinkedList;

public class Main {

public static void main(String[] args) {
/*
    作业要求:叉树的先、中、后 序遍历与层级遍历
    自己实现四个方法,main方法中调用,将结果打印到控制台
 */
/*  二叉树的结构
             A
            / \
           T   6
          /
         D
       /   \
      N     5
     / \    /
    B   4  1
         \
          9
 */
    Node root = into();
    // 先序遍历
    System.out.print("先序:");
    A(root);
    System.out.println();
    // 中序遍历
    System.out.print("中序:");
    B(root);
    System.out.println();
    // 后续遍历
    System.out.print("后序:");
    C(root);
    System.out.println();
    // 层级遍历
    System.out.print("层级:");
    D(root);

}

private static void A(Node root) {
    // TODO 先序遍历
    if (root != null) {
        System.out.print(root.data);
        A(root.l);
        A(root.r);
    }
}

private static void B(Node root) {
    // TODO 中序遍历
    if (root != null) {
        B(root.l);
        System.out.print(root.data);
        B(root.r);
    }
}

private static void C(Node root) {
    // TODO 后序遍历
    if (root != null) {
        C(root.l);
        C(root.r);
        System.out.print(root.data);
    }
}

private static void D(Node root) {
    // TODO 层级遍历
    if (root != null) {
        LinkedList<Node> linkedList = new LinkedList<Node>();
        //先将根节点入队
        linkedList.offer(root);
        Node node = null;
        while (!linkedList.isEmpty()) {//列表不为空
            node = (Node) linkedList.pop();
            System.out.print(node.data);
            if (node.l != null) {
                //将出队结点的左子树根入队
                linkedList.offer(node.l);
            }
            if (node.r != null) {
                //将出队结点的右子树根入队
                linkedList.offer(node.r);
            }
        }
    }
}

// 构建一颗树,返回根节点
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;
    }
}

}

(3)结果

posted on 2020-10-29 14:30  肖涵月  阅读(64)  评论(0)    收藏  举报

导航