https://avatars.githubusercontent.com/u/103393591

C++中序线索二叉链表的建立及遍历

题目 中序线索二叉链表的建立及遍历(数据结构严蔚敏C语言版的C++实现)

输入:字符串序列

输出:结点的相关信息,中序序列

处理方法:

1
2
3
4
5
6
1)在中序遍历过程中修改结点的左、右指针域,以保存当前访问结点的“前驱”和“后继”信息。
2)遍历过程中,附设指针pre,  并始终保持指针pre指向当前访问的指针p所指结点的前驱。
3)中序线索二叉树结构对称。其中:第一个结点是最左下的结点,最后一个结点是最右下的结点。
4)在中序线索二叉树上找结点的(直接)后继/前驱方法:
    a)若该结点有右孩子,其后继为其右子树中最左下的结点;
    b)若该结点无右孩子,其后继由rchild指向:其后继为满足以下条件的最小子树的根r:该结点为r的左子树中最右下的结点。

一、问题分析

线性链表中指向结点前驱和后继的指针,叫做线索,在线索二叉树上进行遍历,只要先找到序列的第一个结点,然后依次找结点的后继直到结点的后继为空时为止。

C++二叉树中叶子结点的个数与深度的统计

题目 统计二叉树中叶子结点的个数,计算二叉树的深度(数据结构严蔚敏C语言版的C++实现)

输入:字符串序列

输出:叶子结点的个数,二叉树的深度

处理方法:

1
2
1)先序遍历二叉树。在遍历过程中查找叶子结点,并计数。由此,需在遍历算法中增添一个“计数”的参数,并将算法中“访问结点”的操作改为:若是叶子,则计数器增1。     
2)后序遍历二叉树。从二叉树深度的定义可知,二叉树的深度应为其左、右子树深度的最大值加1。由此,先分别求得左、右子树的深度,算法中“访问结点”的操作为:求得左、右子树深度的最大值,然后加 1 。

一、问题分析

统计叶子结点的个数需要先序遍历二叉树,增加计数器和判断语句统计叶子节点数。
统计二叉树的深度需要后序遍历二叉树,求得左右两子树深度,判断最大值并加一输出。

C++二叉树的建立

题目 二叉链表的建立,先(中、后)序遍历(数据结构严蔚敏C语言版的C++实现)

输入:字符串序列
输出:先(中、后)序序列
处理方法:通过补虚结点,使二叉树中各实际结点均具有左右孩子,再对该二叉树按先序遍历进行输入。以字符串的形式:根、左子树、右子树定义一棵二叉树:

C++数值逼近-迭代法Aikten法以及牛顿法求解线性方程根通用程序

数值逼近

公元 1225 年,比萨的数学家 Leonardo(即 Fibonacci(斐波那契)),1170-1250)研究了方程

x^3+2*x^2+10*x-20=0

得到一个根 x* = 1.368 808 107,没有人知道他用什么方法得到这个值。对于这个方程,分别用下列方法: (1)迭代法式1 ; (2)迭代法式2 ; (3)对(1)的 Aitken 加速方法; (4)对(2)的 Aitken 加速方法; (5)Newton 法 。 求方程的根(可取 x0 = 1 ),计算到 Leonardo 所得到的准确度。

2021新型冠状病毒(COVID-19/2019-nCoV)疫情分析

新型冠状病毒(COVID-19/2019-nCoV)疫情分析

spiritLHL

重要说明

帮同一个选修课的学妹码的结课作业,这是我个人完善后的版本(她的还有很多错漏)

分析文档:完成度:代码质量 3:5:2

其中分析文档是指你数据分析的过程中,对各问题分析的思路、对结果的解释、说明(要求言简意赅,不要为写而写)

C++数值逼近-Euler方法、改进Euler方法和经典四阶Runge-Kutta方法求解初值问题

数值积分

取步长 h = 0.1 ,分别用 Euler 方法、改进 Euler 方法和经典四阶 Runge-Kutta 方法求解初值问题

1
2
f(x,y) =  ((y)-2*(x)/(y))
f(0)  =   0

并将计算结果与sqrt(1+2*(x))精确解相比较。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include<stdio.h>
#include<math.h>
#include<iostream>
#define _CRT_SECURE_NO_WARNINGS
#include <windows.h>//用于函数SetConsoleOutputCP(65001);更改cmd编码为utf8
using namespace std;

#define f(x,y)  ((y)-2*(x)/(y))
#define y(x)    sqrt(1+2*(x))

int main()
{
    //显示中文
    SetConsoleOutputCP(65001);

    float a = 0,b = 1.0f,h=0.1f,y0=1.0f,x,ye,yp,ym,k1,k2,k3,k4,yr,yx;
    printf("\n    精确解            Euler方法");
    printf("          改进Euler方法     4阶Runge-Kutta方法");
    printf("\n x       y      ye[k]    |ye[k]-y|   ");
    printf("ym[k]   |ym[k]-y|   yr[k]   |yr[k]-y|\n");
    printf("%3.1f  %8.6f  %8.6f  %8.6f  ",a,y0,y0,0);
    printf("%8.6f  %8.6f  %8.6f  %8.6f  \n",y0,0,y0,0.0);

    x=a;
    ye=y0;     //Euler方法的初值
    ym=y0;     //改进的Euler方法的初值
    yr=y0;     //4阶Runge-Kutta方法的初值

    while(x<b)
    {
        ye = ye + h*f(x,ye);   

        yp = ym + h*f(x,ym);

        ym = ym + h/2*(f(x,ym)+f(x+h,yp));

        k1 = f(x,yr);
        k2 = f(x+h/2,yr+h/2*k1);
        k3 = f(x+h/2,yr+h/2*k2);
        k4 = f(x+h,yr+h*k3);
        yr = yr + h/6*(k1+2*k2+2*k3+k4);

        x = x + h;
        yx = y(x);
        printf("%3.1f  %8.6f  %8.6f  %8.6f  %8.6f  %8.6f  %8.6f  %8.6f\n",x,yx,ye,fabs(ye-yx),ym,fabs(ym-yx),yr,fabs(yr-yx));
    }
    system("pause");
    return 0;
}

C++数值逼近-复化梯形公式和复化 Simpson 公式计算定积分的近似值

数值逼近

将区间[0,1]四等分,分别用复化梯形公式和复化 Simpson 公式计算定积分

1
f(x)  4.0 / (1 + (x) * (x))

的近似值。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include<iostream>
using namespace std;
#include<stdio.h>
//显示中文
#define _CRT_SECURE_NO_WARNINGS
#include <windows.h>//用于函数SetConsoleOutputCP(65001);更改cmd编码为utf8 
#define  f(x)  4.0 / (1 + (x) * (x))
void test()
{
    float h = (1.0 - 0) / 4, temp, xk, yk, xkh, ykh, xk1, yk1;
    int i;
    temp = f(0); xk = 0;
    for (i = 1; i < 4; i++)
    {
        xk = xk + h;
        temp = temp + 2 * f(xk);
    }
    temp = temp + f(1);
    temp = temp * h / 2;
    cout << endl;
    cout << "复化梯形公式计算的结果:" << temp << endl;

    temp = 0;
    h = (1.0 - 0) / 2;
    xk = 0;
    yk = f(0);
    for (i = 0; i < 2; i++)
    {
        xkh = xk + h / 2;
        ykh = f(xkh);
        xk1 = xk + h;
        yk1 = f(xk1);
        temp = temp + h * (yk + 4 * ykh + yk1) / 6;
        xk = xk1;
        yk = yk1;
    }
    cout << endl;
    cout << "复化 Simpson 公式计算的结果:" << temp << endl;
    cout << endl;
}
int main()
{
    //显示中文
    SetConsoleOutputCP(65001);
    test();
    system("pause");
    return 0;
}

C++数值逼近-Newton插值法

数值逼近

天安门广场升旗的时间是日出的时刻,而降旗的时间是日落时分。根据天安门广场管理委员会的公告,某年 10 月份升降旗的时间如下:

1
2
3
日期     1                  15                22
升旗   6:09                6:23               6:31
降旗   17:58               17:36              17:26

请根据上述数据构造 Newton 插值多项式,并计算当年 10 月 8 日北京市的日照时长。