二叉树的实现以及其他
一、每日一题
题目描述
这个题主要是考验的数学能力,其实最难的一点就是你要知道这个负进制怎么算;
那么接下就针对三个案例就行分析;
这样是不是更仙显而易见了呢,只不过要注意一下,当余数<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); // 复制原树的右子树给新树的左子树 }
}
测试实例