Educoder头歌数据结构-树和二叉树及其应用

头歌实践平台答案educoder

数据结构-树和二叉树及其应用

第1关二叉树的创建

/*************************************************************
    date: March 2019
	二叉树的创建  实现文件    
**************************************************************/
BiTree CreateBiTree()
// 利用先序遍历创建二叉树,返回根指针。
{
    // 请在这里补充代码,完成本关任务
    /********** Begin *********/
   	/*
    typedef char ElemType;
    typedef struct BiTNode
    { ElemType data;
       struct BiTNode *lchild,*rchild;
    }BiTNode, *BiTree;
    */
    BiTree root;
    char ch;
    scanf("%c",&ch);
    if(ch=='#')
        root = NULL;
    else{
        root = (BiTree)malloc(sizeof(BiTNode));
        if(root!=NULL){
        root-> data = ch;
        root->lchild = CreateBiTree();
        root->rchild = CreateBiTree();
        }

    }
    return root;

    /********** End **********/
}

void InOrder(BiTree T)
// 二叉树的中序遍历
// 参数:二叉树根指针T
// 输出:中间没有空格,末尾不换行。
{
    // 请在这里补充代码,完成本关任务
    /********** Begin *********/
	if(T)//T!=NULL
    {
        InOrder(T->lchild);
        printf("%c",T->data);
        InOrder(T->rchild);
    }
    /********** End **********/
}

第2关计算二叉树的深度和结点个数

/*************************************************************
    date: March 2019
	计算二叉树的深度和结点个数  实现文件    
**************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "binary_tree.h"

int GetTreeDepth(BiTree T)
// 计算二叉树的深度
// 参数:二叉树根指针T
// 返回:二叉树的深度
{
    
    // 请在这里补充代码,完成本关任务
    /********** Begin *********/
    
    int lsd=0,rsd=0,max=0;
    if(T!=NULL)
    {
        lsd = GetTreeDepth(T->lchild);
        rsd = GetTreeDepth(T->rchild);
        (lsd>rsd)?max=(lsd+1):max=(rsd+1);
    }
    return max;

    /********** End **********/
}

int GetNodeNumber(BiTree T)
// 计算二叉树的总结点个数
// 参数:二叉树根指针T
// 返回:二叉树的总结点个数
{
    // 请在这里补充代码,完成本关任务
	/********** Begin *********/
    int count=0;
    if(T!=NULL)
      count = GetNodeNumber(T->lchild) + GetNodeNumber(T->rchild) + 1;//根节点
    return count;
    /********** End **********/
}

int GetLeafNodeNumber(BiTree T)
// 计算二叉树的叶子结点个数
// 参数:二叉树根指针T
// 返回:二叉树的叶子结点个数
{
    // 请在这里补充代码,完成本关任务
    /********** Begin *********/
    int count=0;
    if(T!=NULL)
      {
          if(T->lchild==NULL&&T->rchild==NULL)
          count = 1;
          else
          count = GetLeafNodeNumber(T->lchild) + GetLeafNodeNumber(T->rchild) ;
      }

    return count;
    /********** End **********/
}


实现二叉树左右子树交换

/*************************************************************
    date: March 2019
	实现二叉树左右子树交换  实现文件    
**************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "binary_tree.h"

BiTree BiTreeChange(BiTree T)
// 实现二叉树左右子树的交换
// 参数:二叉树根指针T
// 返回:二叉树根指针
{
    // 请在这里补充代码,完成本关任务
    /********** Begin *********/
    /*
    typedef struct BiTNode
{
	ElemType data;
	struct BiTNode *lchild,*rchild;
}BiTNode, *BiTree; //¶þ²æÁ´±íµÄÀàÐͶ¨Òå

    */
	int max=10000;
 
     BiTNode* str[max];
     int k=0;
     str[k]=0;
     if(T)
     {
         k++;
         str[k]=T->lchild;
         T->lchild=T->rchild;
         T->rchild=str[k];
         T->lchild=BiTreeChange(T->lchild);
         T->rchild=BiTreeChange(T->rchild);
          k++;
     }
     return T;

    /********** End **********/
}

void PreOrder(BiTree T)
// 二叉树的先序遍历
// 参数:二叉树根指针T
// 输出:二叉树的先序遍历,中间没有空格,末尾不换行。
{
    // 请在这里补充代码,完成本关任务
    /********** Begin *********/
     if(T!=NULL){
    printf("%c",T->data);
    PreOrder(T->lchild);
    
    PreOrder(T->rchild);
    }

    /********** End **********/
}



层次遍历二叉树

/*************************************************************
    层次遍历二叉树  实现文件 
    更新于2020年6月8日
**************************************************************/

void HierarchyOrder(BiTree T)
// 二叉树的层次遍历(借助队列实现)
// 参数:二叉树根指针T
// 输出:二叉树的层次遍历,中间没有空格,末尾不换行。
{
	/*
		typedef char ElemType; //二叉链表中结点元素类型
		typedef struct BiTNode
		{
		ElemType data;
		struct BiTNode *lchild,*rchild;
		}BiTNode, *BiTree; //二叉链表的类型定义

		#define  MAXSIZE 100     //最大长度
		typedef BiTNode* QElemType; //队列中数据元素类型
		typedef  struct {
		QElemType  *elem;     //数组空间的起始地址
		int front; // 存放队头元素的下标
		int rear;  // 存放队尾元素的下一个位置的下标                                                      
		}SqQueue;

	*/
    // 请在这里补充代码,完成本关任务
    /********** Begin *********/
//	int e;
	SqQueue Q;//定义队列
	SQ_Initiate(Q);//初始化队列
	if(T!=NULL){
		SQ_In(Q,T);//入根
	}
	while(!SQ_IsEmpty(Q)){
		 SQ_Out(Q,T);
		printf("%c",T->data);
		if(T->lchild!=NULL)
			SQ_In(Q,T->lchild);//入根
		
		if(T->rchild!=NULL)
			SQ_In(Q,T->rchild);//入根
	}


    /********** End **********/
}
  • 25
    点赞
  • 135
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值