【 第9/10关:基于二叉链表的二叉树结点个数的统计/高度的计算】【编程题实训-树和二叉树】【头歌】【bufu270/271】

第9关:基于二叉链表的二叉树结点个数的统计

任务描述

设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,编写三个递归算法对二叉树的结点(度为0、1、2)个数进行统计。

编程要求

输入
多组数据。每组数据一行,为二叉树的前序序列(序列中元素为‘0’时,表示该结点为空)。当输入只有一个“0”时,输入结束。

输出
每组数据输出一行,每行三个数分别为二叉树的度为0、1、2的结点个数。每两个数用空格分隔。

测试说明

平台会对你编写的代码进行测试:

测试输入:

abcd00e00f00ig00h00
abd00e00cf00g00
0

预期输出:

5 0 4
4 0 3

C++代码:

270.h

#include<iostream>
#include<string.h>
using namespace std;

typedef struct BiTNode
{
	char data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

void CreateBiTree(BiTree &T,char S[],int &i)
{//先序建立二叉树
	
if(S[i]=='0')
  T=NULL;
 else
 {
  T=new BiTNode;
  T->data=S[i];
  CreateBiTree(T->lchild,S,++i);
  CreateBiTree(T->rchild,S,++i);
 }


}
void Count(BiTree T,int &a,int &b,int &c)
{//二叉树结点个数的统计
	
if(T==NULL) return;
	if(T->lchild&&T->rchild) c++;
	else if(T->lchild||T->rchild) b++;
	else a++;
    Count(T->rchild,a,b,c);
	Count(T->lchild,a,b,c);
	
}

主函数文件不可编辑:

#include<iostream>
#include<string.h>
#include "270.h"
using namespace std;
int a,b,c;//a、b、c分别表示度为0、1、2的结点个数

int main()
{
	
	char S[100];
	while(cin>>S)
	{
	    if(strcmp(S,"0")==0) break;
		a=b=c=0;
      	int i=-1;
	  	BiTree T;
		CreateBiTree(T,S,++i);
		Count(T,a,b,c);
		cout<<a<<" "<<b<<" "<<c<<endl;
	}
	return 0;
}

第10关:基于二叉链表的二叉树高度的计算

任务描述

设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,,编写递归算法计算二叉树的高度。

编程要求

输入
多组数据。每组数据一行,为二叉树的前序序列(序列中元素为‘0’时,表示该结点为空)。当输入只有一个“0”时,输入结束。

输出
每组数据分别输出一行,为二叉树的高度。

测试说明

平台会对你编写的代码进行测试:

测试输入:

abcd00e00f00ig00h00
abd00e00cf00g00
0

预期输出:

4
3

C++代码:

271.h:

#include<iostream>
#include <string.h>
using namespace std;
typedef struct BiTNode
{
	char data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
void CreateBiTree(BiTree &T,char S[],int &i)
{//先序建立二叉树
	
if(S[i]=='0')
  T=NULL;
 else
 {
  T=new BiTNode;
  T->data=S[i];
  CreateBiTree(T->lchild,S,++i);
  CreateBiTree(T->rchild,S,++i);
 }

}
int Depth(BiTree T)
{//二叉树高度的计算
	
int deep;
    int ldeepth,rdeepth;
    if(T==NULL) return 0;
    else{
        ldeepth=Depth(T->lchild);
        rdeepth=Depth(T->rchild);
        deep=ldeepth>=rdeepth?ldeepth+1:rdeepth+1;
    }
    return deep;

}

主函数文件不可编辑:

#include<iostream>
#include "271.h"
#include <string.h>
using namespace std;

int main()
{
	char S[100];
	while(cin>>S)
	{
	    if(strcmp(S,"0")==0) break;
		int i=-1;
	  	BiTree T;
		CreateBiTree(T,S,++i);
		cout<<Depth(T)<<endl;
	}
	return 0;
}
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
1. 一棵二叉树的顺序存储情况如下: 树中,度为2的点数为( )。 A.1 B.2 C.3 D.4 2. 一棵“完全二叉树点数为25,高度为( )。 A.4 B.5 C.6 D.不确定 3.下列说法中,( )是正确的。 A. 二叉树就是度为2的树 B. 二叉树中不存在度大于2的点 C. 二叉树是有序树 D. 二叉树中每个点的度均为2 4.一棵二叉树的前序遍历序列为ABCDEFG,它的中序遍历序列可能是( )。 A. CABDEFG B. BCDAEFG C. DACEFBG D. ADBCFEG 5.线索二叉树中的线索指的是( )。 A.左孩子 B.遍历 C.指针 D.标志 6. 建立线索二叉树的目的是( )。 A. 方便查找某点的前驱或后继 B. 方便二叉树的插入与删除 C. 方便查找某点的双亲 D. 使二叉树的遍历果唯一 7. 有abc三个点的右单枝二叉树的顺序存储构应该用( )示意。 A. a b c B. a b ^ c C. a b ^ ^ c D. a ^ b ^ ^ ^ c 8. 一颗有2046个点的完全二叉树的第10层上共有( )个点。 A. 511 B. 512 C. 1023 D. 1024 9. 一棵完全二叉树一定是一棵( )。 A. 平衡二叉树 B. 二排序树 C. 堆 D. 哈夫曼树 10.某二叉树的中序遍历序列和后序遍历序列正好相反,则该二叉树一定是( )的二叉树。 A.空或只有一个点 B.高度等于其点数 C.任一点无左孩子 D.任一点无右孩子 11.一棵二叉树的顺序存储情况如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 A B C D E 0 F 0 0 G H 0 0 0 X 点D的左孩子点为( )。 A.E B.C C.F D.没有 12.一棵“完全二叉树点数为25,高度为( )。 A.4 B.5 C.6 D.不确定 二、填空(每空3分,共18分)。 1. 树的路径长度:是从树根到每个点的路径长度之和。对点数相同的树来说,路径长度最短的是 完全 二叉树。 2. 在有n个叶子点的哈夫曼树中,总点数是 2n-1 。 3. 在有n个点的二链表中,值为非空的链域的个数为 n-1 。 4. 某二叉树的中序遍历序列和后序遍历序列正好相反,则该二叉树一定是 任一点无左孩子 的二叉树。 5. 深度为 k 的二叉树最多有 个点,最少有 k 个点。 三、综合(共58分)。 1. 假定字符集{a,b,c,d,e,f }中的字符在电码中出现的次数如下: 字符 a b c d e f 频度 9 12 20 23 15 5 构造一棵哈夫曼树(6分),给出每个字符的哈夫曼编码(4分),并计算哈夫曼树的加权路径长度WPL(2分)。 (符合WPL最小的均为哈夫曼树,答案不唯一) 哈夫曼编码: 2. 假设用于通信的电文由字符集{a,b,c,d,e,f,g}中的字符构成,它们在电文中出现的频率分别为{0.31,0.16,0.10,0.08,0.11,0.20,0.04}。要求: (1)为这7个字符设计哈夫曼树(6分)。 (2)据此哈夫曼树设计哈夫曼编码(4分)。 (3)假设电文的长度为100字符,使用哈夫曼编码比使用3位二进制数等长编码使电文总长压缩多少?(4分) (1) 为这7个字符设计哈夫曼树为(符合WPL最小的均为哈夫曼树,答案不唯一): (2) 哈夫曼编码为: a:01;b:001;c:100;d:0001;e:101;f:11;g:0000 (3) 假设电文的长度为100字符,使用哈夫曼编码比使用3位二进制数等长编码使电文总长压缩多少? 采用等长码,100个字符需要300位二进制数,采用哈夫曼编码发送这100个字符需要261二进制位,压缩了300-261=39个字符。压缩比为39/300=13%。 3. 二数T的(双亲到孩子的)边集为: { <A,B>, <A,C>, <D,A>, <D,E>, <E,F>, <F,G> } 请回答下列问: (1)T的根点(2分): (2)T的叶点(2分): (3)T的深度(2分): (4)如果上述列出边集中,某个点只有一个孩子时,均为其左孩子;某个点有两个孩子时,则先列出了连接左孩子的边后列出了连接右孩子的边。画出该二叉树其及前序线索(6分)。 (1)T的根点 (2)T的叶点 : (3)T的深度 : (4)该二叉树其及前序线索为: 4.现有以下按前序和中序遍历二叉树果: 前序:ABCEDFGHI 中序:CEBGFHDAI 画出该二叉树的逻辑构图(5分),并在图中加入中序线索(5分)。 5.有电文:ABCDBCDCBDDBACBCCFCDBBBEBB。 用Huffman树构造电文中每一字符的最优通讯编码。画出构造的哈夫曼树,并给出每个字符的哈夫曼编码方案。(符合WPL最小的均为哈夫曼树,答案不唯一) (1)构造哈夫曼树(6分): (2)哈夫曼编码方案(4分):
以下是用C语言编写的程序,实现按先序遍历序列建立一个二叉树的二链表统计叉树中叶子个数和二叉树的深度。 ```c #include <stdio.h> #include <stdlib.h> typedef struct TreeNode{ int data; struct TreeNode *lchild; struct TreeNode *rchild; }TreeNode, *BiTree; // 创建二叉树 void createBiTree(BiTree *T){ int data; scanf("%d", &data); if(data == -1){ *T = NULL; }else{ *T = (TreeNode *)malloc(sizeof(TreeNode)); (*T)->data = data; createBiTree(&((*T)->lchild)); createBiTree(&((*T)->rchild)); } } // 统计叶子个数 int countLeafNode(BiTree T){ if(!T) return 0; if(!T->lchild && !T->rchild) return 1; return countLeafNode(T->lchild) + countLeafNode(T->rchild); } // 计算叉树深度 int getDepth(BiTree T){ int leftDepth, rightDepth; if(!T) return 0; leftDepth = getDepth(T->lchild); rightDepth = getDepth(T->rchild); return (leftDepth > rightDepth) ? (leftDepth + 1) : (rightDepth + 1); } int main(){ BiTree T; printf("请输入先序遍历序列:\n"); createBiTree(&T); printf("叶子个数:%d\n", countLeafNode(T)); printf("二叉树深度:%d\n", getDepth(T)); return 0; } ``` 程序的运行果如下: ``` 请输入先序遍历序列: 1 2 -1 -1 3 -1 4 -1 -1 叶子个数:2 二叉树深度:3 ``` 以上程序中,createBiTree()函数用于创建二叉树,countLeafNode()函数用于统计叉树中叶子点的个数,getDepth()函数用于计算叉树的深度。主函数中先要输入先序遍历序列来创建二叉树,然后调用countLeafNode()和getDepth()函数来统计叶子个数计算叉树深度,最后输出果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汤米尼克

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值