第五章习题1-4、习题5-6、习题7-8

 """

一个不知名大学生,江湖人称菜狗
original author: jacky Li
Email : [email protected]
Last edited: 2022.11.16

"""

第五章习题1-4、习题5-6、习题7-8_第1张图片

第五章习题1-4

第1关:统计二叉树叶子节点的个数

任务描述

本关任务:编写一个程序统计二叉树叶子节点的个数。

相关知识

为了完成本关任务,你需要掌握:1.如何创建二叉树,2.如何遍历二叉树。

编程要求

根据提示,在右侧编辑器补充代码,计算并输出叶子节点的个数。

注意

二叉树通过先序遍历创建。

测试说明

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

测试输入:ABD##E##C#F##

预期输出:3


开始你的任务吧,祝你成功!

参考代码

//习题5.3.1统计二叉树中结点的个数
#include
using namespace std;

//二叉树的二叉链表存储表示
typedef struct BiNode
{				
	char data;						//结点数据域
	struct BiNode *lchild,*rchild;	//左右孩子指针
}BiTNode,*BiTree;

//用算法5.3建立二叉链表
void CreateBiTree(BiTree &T)
{	
	//按先序次序输入二叉树中结点的值(一个字符),创建二叉链表表示的二叉树T
	char c; cin >> c;
	if ('#' == c) T = NULL;
	else
	{
		T = new BiTNode;
		T -> data = c;
		CreateBiTree(T -> lchild);
		CreateBiTree(T -> rchild);
	}
}									//CreateBiTree

int LeafNode(BiTree T)
{
    int count=0;
    
    if(T==NULL) return 0;
    else if(T->lchild==NULL && T->rchild==NULL) return count+1;
    else 
    {
        count=LeafNode(T->lchild)+LeafNode(T->rchild);
        return count;
    }
} 

int main()
{
	BiTree tree;
	CreateBiTree(tree);
	cout << LeafNode(tree) << endl;
}

第2关:判断两颗树是否相等

任务描述

本关任务:编写一个程序判断两颗二叉树是否相等。

相关知识

为了完成本关任务,你需要掌握:1.如何创建二叉树,2.如何遍历二叉树。

编程要求

根据提示,在右侧编辑器补充代码,如果树相等输出1,不相等输出0。

注意

二叉树通过先序遍历创建。

测试说明

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

测试输入:

ABD##E##C#G##

ABD##E##C#F##

预期输出:0


开始你的任务吧,祝你成功!

参考代码

//算法5.3.2 判断两颗树是否相等
#include
using namespace std;

//二叉树的二叉链表存储表示
typedef struct BiNode
{				
	char data;						//结点数据域
	struct BiNode *lchild,*rchild;	//左右孩子指针
}BiTNode,*BiTree;

//用算法5.3建立二叉链表
void CreateBiTree(BiTree &T)
{	
	//按先序次序输入二叉树中结点的值(一个字符),创建二叉链表表示的二叉树T
	char ch;
	cin >> ch;
	if(ch=='#')  T=NULL;			//递归结束,建空树
	else{							
		T=new BiTNode;
		T->data=ch;					//生成根结点
		CreateBiTree(T->lchild);	//递归创建左子树
		CreateBiTree(T->rchild);	//递归创建右子树
	}								//else
}									//CreateBiTree

int CmpTree(BiTree T1, BiTree T2)
{
  	if (T1 == 0 && T2 == 0)//两棵树对应位置都为空返回1
  		return 1;
  	else if (T1 == 0 || T2 == 0 ||T1 -> data != T2 -> data) //两棵树的当前节点只有一个为空或者两棵树的当前节点的值不同。
	  	return 0;
  	else return CmpTree(T1 -> lchild, T2 -> lchild) * CmpTree(T1 -> rchild, T2 -> rchild);
}

int main()
{
	BiTree tree1, tree2;
	
    CreateBiTree(tree1);
	CreateBiTree(tree2);
	cout << CmpTree(tree1, tree2) << endl;
    
    return 0;
}

第3关:交换二叉树每个节点的左孩子和右孩子

任务描述

本关任务:编写一个程序交换二叉树每个节点的左孩子和右孩子。

相关知识

为了完成本关任务,你需要掌握:1.如何创建二叉树,2.如何遍历二叉树。

编程要求

根据提示,在右侧编辑器补充代码,计算并输出交换后的中序遍历结果。

注意

二叉树通过先序遍历创建。

测试说明

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

测试输入:ABD##E##C#F##

预期输出:FCAEBD


开始你的任务吧,祝你成功!

参考代码

//141页算法设计题5.3.3交换二叉树每个节点的左右孩子
#include
using namespace std;

//二叉树的二叉链表存储表示
typedef struct BiNode
{				
	char data;						//结点数据域
	struct BiNode *lchild,*rchild;	//左右孩子指针
}BiTNode,*BiTree;

//用算法5.3建立二叉链表
void CreateBiTree(BiTree &T)
{	
	//按先序次序输入二叉树中结点的值(一个字符),创建二叉链表表示的二叉树T
	char c; cin >> c;
	if (c == '#') T = NULL;
	else
	{
		T = new BiTNode;
		T -> data = c;
		CreateBiTree(T->lchild);
		CreateBiTree(T->rchild);
	}
}									//CreateBiTree

void InOrderTraverse(BiTree T)
{
	//中序遍历二叉树T的递归算法
	if(T)
	{
		InOrderTraverse(T -> lchild);
		cout << T -> data;
		InOrderTraverse(T -> rchild);
	}
}

void ChangeLR(BiTree &T)
{
	BiTNode *temp = NULL;
	if(!T) return;
    else 
    {
		temp = T -> lchild;
		T -> lchild = T -> rchild;
		T -> rchild = temp;
    }
    ChangeLR(T -> lchild);
	ChangeLR(T -> rchild);
} 

int main()
{
	BiTree tree;
	
	CreateBiTree(tree);
	ChangeLR(tree); 
	InOrderTraverse(tree);

    return 0;
}

第4关:习题3.4二叉树双序遍历

任务描述

本关任务:编写一个程序实现二叉树的双序遍历。双序遍历指的是对于二叉树的每个节点,先访问这个节点,再按双序遍历它的左子树,然后再一次访问这个节点,然后再按双序遍历右子树。

相关知识

为了完成本关任务,你需要掌握:1.如何创建二叉树,2.如何遍历二叉树。

编程要求

根据提示,在右侧编辑器补充代码,并输出双序遍历结果。

注意

二叉树通过先序遍历创建。

测试说明

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

测试输入:ABD##E##C#F##

预期输出:ABDDBEEACCFF


开始你的任务吧,祝你成功!

参考代码

//141页算法设计题双序遍历3.(4) 
#include
using namespace std;

//二叉树的二叉链表存储表示
typedef struct BiNode
{				
	char data;						//结点数据域
	struct BiNode *lchild,*rchild;	//左右孩子指针
}BiTNode,*BiTree;

//用算法5.3建立二叉链表
void CreateBiTree(BiTree &T)
{	
	//按先序次序输入二叉树中结点的值(一个字符),创建二叉链表表示的二叉树T
	char ch; 
	cin >> ch;
	if(ch=='#')  T=NULL;			//递归结束,建空树
	else{							
		T=new BiTNode;
		T->data=ch;					//生成根结点
		CreateBiTree(T->lchild);	//递归创建左子树
		CreateBiTree(T->rchild);	//递归创建右子树
	}								//else
}									//CreateBiTree

void DoubleTraverse(BiTree T)
{  
	//双序遍历二叉树T的递归算法
	if(T!=NULL)
	{
		printf("%c",T->data);
		DoubleTraverse(T->lchild);
		printf("%c",T->data);
		DoubleTraverse(T->rchild);
	}
}

int main()
{
	BiTree tree;
	CreateBiTree(tree);
	DoubleTraverse(tree);
	return 0;
}

第五章习题5-6

第1关:习题5.3.5二叉树的宽度

任务描述

本关任务:编写一个程序实现求解二叉树的宽度。二叉树的最大宽度是指二叉树所有层中节点个数的最大值。

相关知识

为了完成本关任务,你需要掌握:1.如何使用层次遍历的算法,2.如何利用队列。

编程要求

根据提示,在右侧编辑器补充代码,并输出二叉树的最大宽度。

测试说明

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

测试输入:ABD##E##C#F##

预期输出:3


开始你的任务吧,祝你成功!

参考代码

//141页算法设计题层次遍历树宽3.(5) 
#include
using namespace std;

//二叉树的二叉链表存储表示
typedef struct BiNode
{				
	char data;						//结点数据域
	struct BiNode *lchild,*rchild;	//左右孩子指针
}BiTNode,*BiTree;

//用算法5.3建立二叉链表
void CreateBiTree(BiTree &T)
{	
	//按先序次序输入二叉树中结点的值(一个字符),创建二叉链表表示的二叉树T
	char ch;
	cin >> ch;
	if(ch=='#')  T=NULL;			//递归结束,建空树
	else
	{							
		T=new BiTNode;
		T->data=ch;					//生成根结点
		CreateBiTree(T->lchild);	//递归创建左子树
		CreateBiTree(T->rchild);	//递归创建右子树
	}								//else
}									//CreateBiTree

int Width(BiTree T)
{  
	if (T == NULL) return (0);             		//空二叉树宽度为0
	else 
	{ 
		BiTree Q[100], p;                  		//Q是队列,元素为二叉树结点指针,容量足够大
	    int front = 1, rear = 1, last = 1;	 	//front队头指针,rear队尾指针,last同层最右结点在队列中的位置
		int temp = 0, maxw = 0;            		//temp记局部宽度, maxw记最大宽度
	    Q[rear] = T;          				 	//根结点入队列
	    while(front <= last)
		{
			p = Q[front ++], temp ++; 							//同层元素数加1
	        if(p -> lchild != NULL)  Q[++ rear] = p -> lchild;   //左子女入队
			if(p -> rchild != NULL)  Q[++ rear] = p -> rchild;   //右子女入队
			if(front > last)      				//一层结束, 
			{ 
				last = rear;
				if(temp > maxw) maxw = temp;	//last指向下层最右元素, 更新当前最大宽度
				temp = 0;
			}
		}
	    return maxw;
	}
}

int main()
{
	BiTree tree;
	CreateBiTree(tree);
	cout << Width(tree) << endl;
	return 0;
}

第2关:习题5.3.6度为1的节点数目

任务描述

本关任务:编写一个程序实现层次遍历二叉树,并求出二叉树中度为1的节点数目。

相关知识

为了完成本关任务,你需要掌握:1.如何使用层次遍历的算法,2.如何利用队列。

编程要求

根据提示,在右侧编辑器补充代码,并输出遍历的结果和二叉树中度为1的节点数目。

测试说明

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

测试输入:ABD##E##C#F##

预期输出:

ABCDEF

1


开始你的任务吧,祝你成功!

参考代码

//141页算法设计题双序遍历3.(6)度为1的节点数目 
#include
using namespace std;
#define OK 1
#define ERROR 0
typedef int Status;
//二叉树的二叉链表存储表示
typedef struct BiNode
{				
	char data;						//结点数据域
	struct BiNode *lchild,*rchild;	//左右孩子指针
}BiTNode,*BiTree;

typedef struct QNode {
	BiTree data;
	struct QNode *next;
} QNode, *QueuePtr;

typedef struct {
	QueuePtr front; //队头指针
	QueuePtr rear; //队尾指针
} LinkQueue;

//算法3.16 链队的初始化
Status InitQueue(LinkQueue &Q) 
{//构造一个空队列Q
	Q.front = Q.rear = new QNode; //生成新结点作为头结点,队头和队尾指针指向此结点
	Q.front->next = NULL; //头结点的指针域置空
	return OK;
}

//算法3.17 链队的入队
Status EnQueue(LinkQueue &Q, BiTree e) {//插入元素e为Q的新的队尾元素
	QueuePtr p;
	p = new QNode; //为入队元素分配结点空间,用指针p指向
	p->data = e; //将新结点数据域置为e
	p->next = NULL;
	Q.rear->next = p; //将新结点插入到队尾
	Q.rear = p; //修改队尾指针
	return OK;
}

//算法3.18 链队的出队
Status DeQueue(LinkQueue &Q, BiTree &e) {//删除Q的队头元素,用e返回其值 
	QueuePtr p;
	if (Q.front == Q.rear)
		return ERROR; //若队列空,则返回ERROR
	p = Q.front->next; //p指向队头元素
	e = p->data; //e保存队头元素的值
	Q.front->next = p->next; //修改头指针
	if (Q.rear == p)
		Q.rear = Q.front; //最后一个元素被删,队尾指针指向头结点
	delete p; //释放原队头元素的空间
	return OK;
}
Status QueueEmpty(LinkQueue Q)
{
	return Q.front == Q.rear;
}
//用算法5.3建立二叉链表
void CreateBiTree(BiTree &T)
{	
	//按先序次序输入二叉树中结点的值(一个字符),创建二叉链表表示的二叉树T
	char ch;
	cin >> ch;
	if(ch=='#')  T=NULL;			//递归结束,建空树
	else{							
		T=new BiTNode;
		T->data=ch;					//生成根结点
		CreateBiTree(T->lchild);	//递归创建左子树
		CreateBiTree(T->rchild);	//递归创建右子树
	}								//else
}									//CreateBiTree

int Level(BiTree T)
{  
	int temp = 0;
	if(!T) return 0;
	else 
	{
		BiTree Q[100], p;
		int front = 1, rear = 1, last = 1;
		Q[rear] = T;
		while(front <= last)
		{
			p = Q[front ++];
			if(p -> lchild == NULL && p -> rchild != NULL) 
			{
				Q[++ rear] = p -> rchild, temp ++;
//				cout << p;
			}
			else if(p -> lchild != NULL && p -> rchild == NULL)
			{
				Q[++ rear] = p -> lchild, temp ++;
//				cout << p;
			}
			else if(p -> lchild && p -> rchild)
				Q[++ rear] = p -> lchild, Q[++ rear] = p -> rchild;
			if(front > last) last = rear;
		}
		for(int i = 1; i <= rear; i ++) cout << Q[i] -> data;
		cout << endl;
	}
	return temp;
}


int main()
{
	BiTree tree;
	CreateBiTree(tree);
	cout << Level(tree) << endl;
	return 0;
}

第五章习题7-8

第1关:习题5.3.7最长路径长度

任务描述

本关任务:编写求最长路径长度的程序,并输出此路径上的各节点的值。

相关知识

为了完成本关任务,你需要掌握:1.如何创建二叉树2.如何遍历二叉树。

编程要求

根据提示,在右侧编辑器补充代码,计算并输出最长路径上各节点的值。

测试说明

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

测试输入:-*a##b##c##

预期输出:-*a


开始你的任务吧,祝你成功!

参考代码

//141页算法设计题最长路径3.(7) 
#include
using namespace std;

//二叉树的二叉链表存储表示
typedef struct BiNode
{				
	char data;						//结点数据域
	struct BiNode *lchild,*rchild;	//左右孩子指针
}BiTNode,*BiTree;

//用算法5.3建立二叉链表
void CreateBiTree(BiTree &T)
{	
	//按先序次序输入二叉树中结点的值(一个字符),创建二叉链表表示的二叉树T
	char ch;
	cin >> ch;
	if(ch=='#')  T=NULL;			//递归结束,建空树
	else{							
		T=new BiTNode;
		T->data=ch;					//生成根结点
		CreateBiTree(T->lchild);	//递归创建左子树
		CreateBiTree(T->rchild);	//递归创建右子树
	}								//else
}									//CreateBiTree

int Depth(BiTree p)
{
    if (p == NULL) return (0);
    return 1 + (Depth(p -> lchild) > Depth(p -> rchild) ? Depth(p -> lchild) : Depth(p -> rchild));
}

void LongestPath(BiTree T)
{  
	if (T)
	{
	    cout << T -> data;
	    if (Depth(T -> lchild) >= Depth(T -> rchild)) LongestPath(T -> lchild);
	    else LongestPath(T -> rchild);
	}
}


int main()
{
	BiTree tree;
	CreateBiTree(tree);
//	cout << Depth(tree) << endl;
	LongestPath(tree);
	return 0;
}

习题5.3.8叶子结点到根节点的所有路径

任务描述

本关任务:编写并输出叶子节点到根节点的所有路径。

相关知识

为了完成本关任务,你需要掌握:1.如何创建二叉树2.如何遍历二叉树。

编程要求

根据提示,在右侧编辑器补充代码,并输出所有路径上的节点。

测试说明

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

测试输入:-*a##b##c##

预期输出:

a到根节点路径a*-

b到根节点路径b*-

c到根节点路径c-


开始你的任务吧,祝你成功!

参考代码

//141页算法设计题叶子结点到根节点的路径3.(8) 
#include
using namespace std;

//二叉树的二叉链表存储表示
typedef struct BiNode
{				
	char data;						//结点数据域
	struct BiNode *lchild,*rchild;	//左右孩子指针
}BiTNode,*BiTree;

//用算法5.3建立二叉链表
void CreateBiTree(BiTree &T)
{	
	//按先序次序输入二叉树中结点的值(一个字符),创建二叉链表表示的二叉树T
	char ch;
	cin >> ch;
	if(ch=='#')  T=NULL;			//递归结束,建空树
	else{							
		T=new BiTNode;
		T->data=ch;					//生成根结点
		CreateBiTree(T->lchild);	//递归创建左子树
		CreateBiTree(T->rchild);	//递归创建右子树
	}								//else
}									//CreateBiTree

void AllPath(BiTree T, char path[], int pathlen)
{  
	if(T != NULL)
	{
	    if(T -> lchild == NULL && T -> rchild == NULL)
	    {
	        path[pathlen] = T -> data;
	        printf("%c到根节点路径",T -> data);
	        for(int i = pathlen; i >= 0; i --)
            	cout << path[i];
	        puts("");
	    }
	    else
        {
	        path[pathlen ++] = T -> data;
	        AllPath(T -> lchild, path, pathlen);
	        AllPath(T -> rchild, path, pathlen);
			pathlen --;
	    }
	}
}

int main()
{
	BiTree tree;
	CreateBiTree(tree);
	char path[1000];
	AllPath(tree, path, 0);
	return 0;
}

如果感觉博主讲的对您有用,请点个关注支持一下吧,将会对此类问题持续更新……

你可能感兴趣的:(java,c,数据结构等相关作业,链表,数据结构)