作者:@黑眼圈ing
机电专业 工科男
CSDN@黑眼圈ing
每天进步一点点!
学习思路:1.先理解算法的主要思想,2.背模板,3.多做几道题
先赞后看,养成习惯! ! ! ^ _ ^ ❤️ ❤️ ❤️
码字不易,大家的支持是我坚持的动力。点赞后不要忘了关注我哦!
一、二叉树遍历———绕行踩点法
1.前序遍历
void PreOrder(Tree* p)
{
if (p == NULL)
return;
printf("%d ",p->date);
PreOrder(p->left);
PreOrder(p->right);
}
让思维绕行二叉树,当经过结点左侧时,就输出该结点的值(如图五角星的位置)
2.中序遍历
void InOrder(Tree* p)
{
if (p == NULL)
return;
PreOrder(p->left);
printf("%c",p->date);
PreOrder(p->right);
}
让思维绕行二叉树,当经过结点底下时,就输出该结点的值(如图圆圈的位置)
3.后序遍历
void InOrder(Tree* p)
{
if (p == NULL)
return;
PreOrder(p->left);
PreOrder(p->right);
printf("%c",p->date);
}
让思维绕行二叉树,当经过结点右侧时,就输出该结点的值(如图矩形的位置)
二、判断二叉树
有一棵树,已知先序遍历和中序遍历如何确定二叉树?
因为先序遍历的第一个值就是二叉树的根结点,在中序遍历中将二叉树分为左子树和右子树,然后左子树又分为根、左子树和右子树,按照这种方法循环往复,最后确定二叉树
已知后序遍历和中序遍历如何确定二叉树?
因为后序遍历的最后一个值就是二叉树的根结点,在中序比那里中将二叉树分为左子树和右子树,然后右子树继续分为根、左子树和右子树,循环往复,最后确定二叉树
三、高精度计算
1.高精度算法 ——加法
const int N = 1000;
int A[N], B[N], C[N];
int la, lb, lc;
void Add(int A[], int B[],int C[])
{
for (int i = 0; i < lc; i++)
{
C[i] += A[i] + B[i];//累加
C[i + 1] += C[i] / 10;//进位
C[i] %= 10;//存余
}
if (C[lc])//处理最高位
lc++;
}
int main()
{
string a, b;
cin >> a >> b;
la = a.size();
lb = b.size();
lc = max(la, lb);
for (int i = la - 1; ~i; i--)
A[la - 1 - i] = a[i] - '0';
for (int i = lb - 1; ~i; i--)
B[lb - 1 - i] = b[i] - '0';
Add(A,B,C);
for (int i = lc - 1; ~i; i--)
{
cout << C[i];//从高位到低位输出
}
return 0;
}
2.高精度算法 ——减法
const int N = 1000;
int A[N], B[N], C[N];
int la, lb, lc;
bool cmp(int A[],int B[])
{
if (la != lb)
return la > lb;
for (int i = 0; i < lc; i++)
{
if (A[i] != B[i])
return A[i]>B[i];
}
return true; //避免结果为-0
}
void sub(int A[],int B[],int C[])
{
for (int i = 0; i < lc; i++)
{
if (A[i] < B[i])
{
C[i + 1]--;//借位
C[i] += 10;
C[i] += A[i] - B[i];//存差
}
C[i] %= 10;
}
while (lc && C[lc] == 0)
lc--;//处理前导0
}
int main()
{
string a, b;
cin >> a >> b;
la = a.size();
lb = b.size();
lc = max(la, lb);
for (int i = la - 1; ~i; i--)
A[la - 1 - i] = a[i] - '0';
for (int i = lb - 1; ~i; i--)
B[lb - 1 - i] = b[i] - '0';
if (!cmp(A, B)) swap(A, B),cout << '-';
sub(A, B, C);
for (int i = lc - 1; ~i; i--)
{
cout << C[i];//从高位到低位输出
}
return 0;
}
3.高精度算法——除法
const int N = 1000;
int A[N], B[N], C[N];
int la, b, lc;
void div(int A[],int b,int C[])
{
long long r = 0;
for (int i = lc - 1; ~i; i--)
{
r = r * 10 + A[i];//被除数
C[lc - 1 - i] = r / b;//存商
r %= b;//余数
}
reverse(C, C + lc);
while (lc && C[lc] == 0)
lc--;//处理多余的0
}
int main()
{
string a;
cin >> a >> b;
lc = la = a.size();
for (int i = la - 1; ~i; i--)
A[la - 1 - i] = a[i] - '0';
div(A, b, C);
for (int i = lc - 1; ~i; i--)
{
cout << C[i];//从高位到低位输出
}
return 0;
}
4.高精度算法——乘法
const int N = 1000;
int A[N], B[N], C[N];
int la, lb, lc;
void mul(int A[], int B[], int C[])
{
for(int i=0;i<la;i++)
for (int j = 0; j < lb; j++)
{
C[i + j] += A[i] * B[j];//累加乘积
C[i + j + 1] += C[i + j] / 10;//进位
C[i + j] %= 10;//存余
}
while (lc && C[lc] == 0)
lc--;//处理多余的0
}
int main()
{
string a, b;
cin >> a >> b;
la = a.size();
lb = b.size();
lc = la+lb;
for (int i = la - 1; ~i; i--)
A[la - 1 - i] = a[i] - '0';
for (int i = lb - 1; ~i; i--)
B[la - 1 - i] = b[i] - '0';
mul(A, B, C);
for (int i = lc ; ~i; i--)
{
cout << C[i];//从高位到低位输出
}
return 0;
}
总结
欢迎各位大佬评论,如果有哪里有错误的地方,还请各位大佬指出,我会虚心接受的!!!
每天进步一点儿!!!
感谢大佬们的支持!!!感谢大佬们的支持!!!感谢大佬们的支持!!!