一个不知名大学生,江湖人称菜狗
original author: jacky Li
Email : [email protected]
Last edited: 2022.11.16
"""
本关任务:编写一个程序统计二叉树叶子节点的个数。
为了完成本关任务,你需要掌握: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;
}
本关任务:编写一个程序判断两颗二叉树是否相等。
为了完成本关任务,你需要掌握: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;
}
本关任务:编写一个程序交换二叉树每个节点的左孩子和右孩子。
为了完成本关任务,你需要掌握: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;
}
本关任务:编写一个程序实现二叉树的双序遍历。双序遍历指的是对于二叉树的每个节点,先访问这个节点,再按双序遍历它的左子树,然后再一次访问这个节点,然后再按双序遍历右子树。
为了完成本关任务,你需要掌握: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;
}
本关任务:编写一个程序实现求解二叉树的宽度。二叉树的最大宽度是指二叉树所有层中节点个数的最大值。
为了完成本关任务,你需要掌握: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;
}
本关任务:编写一个程序实现层次遍历二叉树,并求出二叉树中度为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;
}
本关任务:编写求最长路径长度的程序,并输出此路径上的各节点的值。
为了完成本关任务,你需要掌握: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;
}
本关任务:编写并输出叶子节点到根节点的所有路径。
为了完成本关任务,你需要掌握: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;
}
如果感觉博主讲的对您有用,请点个关注支持一下吧,将会对此类问题持续更新……