二叉树的实现以及其他

一、每日一题

 题目描述

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

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

 

 

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

测试实例

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值