2020软件工程作业04
|这个作业属于哪个课程|https://edu.cnblogs.com/campus/zswxy/2018SE/|
| ---- | ---- | ---- |
|这个作业要求在哪里|https://edu.cnblogs.com/campus/zswxy/2018SE/homework/11406|
|这个作业的目标|熟悉算法知识并完成算法题目|
第一题
解题代码:
`
import java.util.Arrays;
import java.util.Scanner;
public class sf {
Scanner input =new Scanner(System.in);
int n=0;
System.out.print("输入序列长度:");
n =input.nextInt();
int [] line = new int[n];
System.out.print("输入序列值:");
for (int i = 0; i < n; i++) {
line[i]=input.nextInt();
}
System.out.print("输入询问次数:");
int m =input.nextInt();
int l,r,k;
int []answer =new int[m];
for (int j = 0; j < m; j++) {
System.out.print("输入l r k:");
l =input.nextInt();
r=input.nextInt();
k=input.nextInt();
int[] newline =Arrays.copyOfRange(line, l-1, r);
for (int i = 0; i < newline.length-1; i++) {
for (int o = 0; o < newline.length-1-i; o++) {
if (newline[o]>newline[o+1]) {
int temp =newline[o];
newline[o]=newline[o+1];
newline[o+1]=temp;
}
}
answer[j]=newline[newline.length-k];
}
}
System.out.println("输出结果:");
for (int i : answer) {
System.out.println(i);
}
}
`
解题思路:
获取输入的数字
获取序列的长度
获取序列具体的值
定义一个数组arr利用for循环将输入的值保存
输入查询次数
输入查询数组中区间及区间内值位置
输出结果
第二题
解题代码:
`
package test;
import java.util.LinkedList;
public class test1 {
public static void main(String[] args) {
/* 二叉树的结构
A
/
T 6
/
D
/
N 5
/ \ /
B 4 1
9
*/
Node root = into();
// 先序遍历
A(root);
System.out.println("先序遍历");
// 中序遍历
B(root);
System.out.println("中序遍历");
// 后续遍历
C(root);
System.out.println("后序遍历");
// 层级遍历
D(root);
System.out.println("层级遍历");
}
private static void A(Node tree) {
// TODO 先序遍历
if (tree != null) {
System.out.print(tree.data + " ");
A(tree.l);
A(tree.r);
}
}
private static void B(Node tree) {
// TODO 中序遍历
if (tree != null) {
B(tree.l);
System.out.print(tree.data + " ");
B(tree.r);
}
}
private static void C(Node tree) {
// TODO 后续遍历
if (tree != null) {
C(tree.l);
C(tree.r);
System.out.print(tree.data + " ");
}
}
private static void D(Node tree) {
// TODO 层级遍历
if (tree != null) {
LinkedList<Node> linkedList = new LinkedList<Node>();
//先将根节点入队,LinkedList类是双向列表,列表中的每个节点都包含了对前一个和后一个元素的引用.
linkedList.offer(tree);
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;
}
}
}
`
解题思路:
先序:到一个节点后,即刻输出该节点的值,并继续遍历其左右子树。(根左右)
中序:到一个节点后,将其暂存,遍历完左子树后,再输出该节点的值,然后遍历右子树。(左根右)
后序:到一个节点后,将其暂存,遍历完左右子树后,再输出该节点的值。(左右根)