【算法】每日一练中的模拟计算器,二叉树开为链表

14天阅读挑战赛
每天学习算法,一点一点积累。

【算法】每日一练中的模拟计算器,二叉树开为链表_第1张图片
书中写到:数据结构+算法=程序,数据结构是程序的骨架,算法是程序的灵魂。
我觉得这一句话说的很对,程序有了灵魂才能更持久
【算法】每日一练中的模拟计算器,二叉树开为链表_第2张图片

算法题目描述

算法知识点如下
模拟计算器,类型:算法初阶,比较简单。
设计学生类和子类,类型:基础知识,比较简单。
二叉树开展为链表,类型:栈,树,中等难度。

第一题算模拟简单的计算器法题目描述

模拟简单的计算器。 要求:
(1)定义名为Number的类,在其中定义两个私有的整型数据成员n1和n2;
(2)在Number类中编写构造方法,赋予n1和n2初始值;
(3)再为Number类定义加(addition)、减(subtration)、乘(multiplication)、除(division)四个公有成员方法,分别对两个成员变量执行加、减、乘、除的运算。注意:除法运算时要抛出除数为0的异常。
(4)在主方法中创建Number类的对象,调用上述各个方法,测试并输出计算结果,注意进行必要的异常捕获与处理。

Java解答参考思路

public class Number {
    private int n1;
    private int n2;
    public Number(int n1, int n2) {
        this.n1 = n1;
        this.n2 = n2;
    }
    public int addition() {
        return n1 + n2;
    }
    public int subtration() {
        return n1 - n2;
    }
    public int multiplication() {
        return n1 * n2;
    }
    private int division() {
        if (n2 == 0) {
            throw new IllegalArgumentException("除数参数不合法");
        }
        return n1 / n2;
    }
    public static void main(String[] args) {
        Number number = new Number(6, 0);
        System.out.println(number.addition());
        System.out.println(number.subtration());
        System.out.println(number.multiplication());
        try {
            System.out.println(number.division());
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}

第二题设计一个学生类和子类题目描述

设计一个学生类Student和它的一个子类Undergraduate,要求如下:
(1)Student类有name和age属性,一个包含两个人参数的构造器,用于给两属性赋值,一个show()方法打印Student的属性信息。
(2)本科生类Undergraduate增加一个degree(学位)属性。有一个包含三参数的构造器,前两个参数用于给集成的属性赋值,第三个参数给degree专业见值,一个show()方法用于打印Undergraduate的属性信息。
(3)在测试类中分别打印Undergraduate和Student对象,调用它们的show()

Java解答代码

public class test {
    public static void main(String[] args) {
        Student stu = new Student("student", 100);
        stu.show();
        Undergraduate undergraduate = new Undergraduate("Undergraduate", 20, "本科");
        undergraduate.show();
    }
}
class Student { 
    private String name;
    private int age;
    public Student() {
        super();
    }
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public double getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public void show() {
        System.out.println("名字:" + this.name + "\t年龄:" + this.age);
    }
}
class Undergraduate extends Student {
    private String degree;
    public Undergraduate(String name, int age, String degree) {
        super(name, age);
        this.degree = degree;
    }
    public void show() {
        System.out.println("名字:" + super.getName() + "\t年龄:" + super.getAge() + "\t学位:" + this.degree);
    }
}

第三题二叉树开为链表题目描述

给你二叉树的根结点 root ,请你将它展开为一个单链表:
展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。
展开后的单链表应该与二叉树 先序遍历 顺序相同。
什么是先序遍历呢?解释如下:
【算法】每日一练中的模拟计算器,二叉树开为链表_第3张图片
需要实现如下:
【算法】每日一练中的模拟计算器,二叉树开为链表_第4张图片

输入:root = [1,2,5,3,4,null,6]
输出:[1,null,2,null,3,null,4,null,5,null,6]

示例 2:
输入:root = []
输出:[]

示例 3:
输入:root = [0]
输出:[0]

提示:
树中结点数在范围 [0, 2000] 内
-100 <= Node.val <= 100

进阶:你可以使用原地算法(O(1) 额外空间)展开这棵树吗?

Java代码解题

public class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) {
        val = x;
    }
}
class Solution {
    public void flatten(TreeNode root) {
        while (root != null) {
            if (root.left == null)
                root = root.right;
            else {
                TreeNode pre = root.left;
                while (pre.right != null)
                    pre = pre.right;
                    pre.right = root.right;
                    root.right = root.left;
                   root.left = null;
                   root = root.right;
            }
        }
    }
}

你可能感兴趣的:(算法,算法,链表,数据结构)