> 文章列表 > 二叉树的实现以及其他

二叉树的实现以及其他

二叉树的实现以及其他

一、每日一题

 题目描述

 这个题主要是考验的数学能力,其实最难的一点就是你要知道这个负进制怎么算;

那么接下就针对三个案例就行分析;

 

 

 这样是不是更仙显而易见了呢,只不过要注意一下,当余数<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); // 复制原树的右子树给新树的左子树 }
}

测试实例