一、每日一题
题目描述
这个题主要是考验的数学能力,其实最难的一点就是你要知道这个负进制怎么算;
那么接下就针对三个案例就行分析;
这样是不是更仙显而易见了呢,只不过要注意一下,当余数<0的时候,那么就要将余数+2,然后n+1,这样才能得出正确答案
代码实现
char* baseNeg2(int n) {
char *x=(char*)malloc(sizeof(char)*32);
int k=0,t;
if(n==0) //特判
{
x[0]='0';
x[1]='\0';
}
else
{
while(n!=0)
{
t=n%-2;
n/=-2;
if(t<0) //余数为0的时候
{
t+=2;
n+=1;
}
x[k++]=t+'0';
}
x[k]='\0'; //结束符号
}
for(int i=0;i<k/2;i++) //字符逆转
{
char a=x[i];
x[i]=x[k-i-1];
x[k-i-1]=a;
}
return x;
}
二、叉树的实现
二叉树链表创建
typedef struct tree
{
char date; //存放数据
struct tree *left; //左儿子
struct tree* right; //右儿子
}tree,*bittree;
二叉树的创建
bittree creat()
{
char x,y;
bittree s;
scanf_s("%c", &x);
y=getchar();
if (x == '-')s = NULL;
else
{
s = (bittree)malloc(sizeof(tree));
s->date = x;
printf("请输入%c的左结点:", s->date);
s->left=creat();
printf("请输入%c的右结点:", s->date);
s->right=creat();
}
return s;
}
先序遍历
void pre(bittree s)
{
if (s !=NULL)
{
printf("%c ", s->date);
pre(s->left);
pre(s->right);
}
}
中序遍历
void inoder(bittree s)
{
if (s != NULL)
{
pre(s->left);
printf("%c ", s->date);
inoder(s->right);
}
}
后序遍历
void post(bittree s)
{
if (s != NULL)
{
post(s->left);
post(s->right);
printf("%c ", s->date);
}
}
深度计算
void dfs(bittree s,int step) //用dfs进行搜索
{
if (s == NULL)return;
if (max < step)max = step;
dfs(s->left, step + 1); //把左边的最大深度找出来
dfs(s->right, step + 1); //把右边的最大深度找出来
}
计算二叉树中的结点
int treecount(bittree s) //计算二叉树中的结点有多少个
{
if (s == NULL)return 0; //当结点没有儿子的时候就不加
return treecount(s->left) + treecount(s->right)+1;
}
计算二叉树中的叶子结点
int count(bittree s) //计算二叉树中的叶子结点有多少个
{
int sum=0,a,b;
if (s == NULL)return 0;
if (s->left == NULL && s->right == NULL)sum++;
a = count(s->left); //计算左边的叶子结点
b = count(s->right); //计算右边的叶子结点
sum += a + b;
return sum;
}
交换左右子树
void change(bittree s,bittree &news) // 交换左右子树
{
if (s == NULL)
{
news = NULL;
return;
}
else
{
news = (bittree)malloc(sizeof(tree));
news->date = s->date;
change(s->left, news->left); // 复制原树的左子树给新树的右子树
change(s->right, news->right); // 复制原树的右子树给新树的左子树
}
}
测试实例