第1关:二叉树的基本操作
#include <iostream>
#include <stdio.h>
using namespace std;
typedef struct node /*二叉树结构定义*/
{
char data;
struct node *lchild,*rchild;
}binnode;
typedef binnode *bintree;
bintree CreateBinTree( );/*按前序遍历顺序建立一棵二叉树,通过函数返回值返回树根地址 */
void PreOrder(bintree T); /* t为指向树根结点的指针,树的前序遍历*/
void InOrder(bintree T); /* t为指向树根结点的指针,树的中序遍历*/
void PostOrder(bintree T); /* t为指向树根结点的指针,树的后序遍历*/
/*按前序遍历顺序建立一棵二叉树,返回树根地址*/
bintree CreateBinTree()
{
// 请填写代码完成功能
/*************begin************/
char ch;
scanf("%c", &ch);
if (ch == '#') {
return NULL;
} else {
bintree T = new binnode;
T->data = ch;
T->lchild = CreateBinTree(); // 递归创建左子树
T->rchild = CreateBinTree(); // 递归创建右子树
return T;
}
/*************end*************/
}
/* t为指向树根结点的指针,树的前序遍历*/
void PreOrder(bintree T)
{
// 请填写代码完成功能
/*************begin************/
if (T != NULL) {
cout << T->data;
PreOrder(T->lchild);
PreOrder(T->rchild);
}
/*************end*************/
}
/* t为指向树根结点的指针,树的中序遍历*/
void InOrder(bintree T)
{
// 请填写代码完成功能
/*************begin************/
if (T != NULL) {
InOrder(T->lchild);
cout << T->data;
InOrder(T->rchild);
}
/*************end*************/
}
/* t为指向树根结点的指针,树的后序遍历*/
void PostOrder(bintree T)
{
// 请填写代码完成功能
/*************begin************/
if (T != NULL) {
PostOrder(T->lchild);
PostOrder(T->rchild);
cout << T->data;
}
/*************end*************/
}
第2关:访问二叉树的特殊结点(先序最后一个结点和后序第一个结点
任务描述
本关任务:编写程序,访问二叉树的先序末点和后序首点。
相关知识
为了完成本关任务,你需要掌握:
理解二叉树的先序遍历和后序遍历的特点。


#include <iostream>
using namespace std;
typedef struct node /*二叉树结构定义*/
{
char data;
struct node *lchild,*rchild;
}binnode,*bintree;
void CreateBinTree(bintree &T);/*按前序遍历顺序建立一棵二叉树,通过引用类型返回树根地址 */
binnode *PreLast(bintree T); /* t为指向树根结点的指针,返回先序遍历的最后一个结点地址,如果树为空,返回NULL*/
binnode *PostFirst(bintree T);/* t为指向树根结点的指针,返回后序遍历的第一个结点地址,如果树为空,返回NULL*/
/* T为指向树根结点的指针,返回后序遍历的第一个结点地址,如果树为空,返回NULL*/
binnode *PostFirst(bintree T)
{
// 请在下面填写代码
/*************begin************/
if (!T) return NULL;
if (!T->lchild && !T->rchild) return T;
binnode* left = PostFirst(T->lchild);
return left ? left : PostFirst(T->rchild);
/*************end*************/
}
/* T为指向树根结点的指针,返回先序遍历的最后一个结点地址,如果树为空,返回NULL*/
binnode *PreLast(bintree T)
{
// 请在下面填写代码
/*************begin************/
if (!T) return NULL;
binnode* lastNode = T;
while (lastNode->lchild || lastNode->rchild) {
if (lastNode->rchild) {
lastNode = lastNode->rchild;
} else {
lastNode = lastNode->lchild;
}
}
return lastNode;
/*************end*************/
}
第3关:二叉树所有结点的左右子树互换
相关知识
为了完成本关任务,你需要掌握:
二叉树的先序遍历算法。

#include <iostream>
using namespace std;
typedef struct node /*二叉树结构定义*/
{
char data;
struct node *lchild,*rchild;
} binnode,*bintree;
void CreateBinTree(bintree &T);/*按前序遍历顺序建立一棵二叉树,通过引用类型返回树根地址 */
void Change(bintree T); /* 将一棵给定二叉树中所有结点的左、右子女互换。*/
void DispBinTree(bintree T);/* 以括号表示法输出二叉树*/
/* 将一棵给定二叉树中所有结点的左、右子女互换。*/
void Change(bintree T)
{
//请在这里编写函数
/*************begin************/
if (T != NULL) {
// 递归地对左右子树进行交换
Change(T->lchild);
Change(T->rchild);
// 交换当前节点的左右子节点
binnode *temp = T->lchild;
T->lchild = T->rchild;
T->rchild = temp;
}
/*************end*************/
}
第4关:删除指定值的叶节点
任务描述
本关任务:给定一棵以 root 为根的二叉树和字符 target,请删除所有值为 target 的叶子节点。
注意,一旦删除值为 target 的叶子节点,它的父节点就可能变成叶子节点;如果新叶子节点的值恰好也是 target,那么这个节点也应该被删除。也就是说,你需要重复此过程直到不能继续删除。
相关知识
为了完成本关任务,你需要掌握:
1.二叉树的后序遍历

#include <iostream>
using namespace std;
typedef struct node /*二叉树结构定义*/
{
char data;
struct node *lchild,*rchild;
} binnode,*bintree;
void CreateBinTree(bintree &T);/*按前序遍历顺序建立一棵二叉树,通过引用类型返回树根地址 */
void RemoveLeafNodes(bintree &T, char target); // 删除指定叶节点
void DispBinTree(bintree T); // 先序输出T
void RemoveLeafNodes(bintree &T, char target)
{
//你的代码写在这里
/**********begin***********/
if (T != NULL) {
// 递归删除左子树中的目标叶节点
RemoveLeafNodes(T->lchild, target);
// 递归删除右子树中的目标叶节点
RemoveLeafNodes(T->rchild, target);
// 检查当前节点是否为目标叶节点
if (T->lchild == NULL && T->rchild == NULL && T->data == target) {
delete T; // 删除节点
T = NULL; // 将父节点的指针设为NULL
}
}
/**********end***********/
}
二叉树操作任务及相关知识
216

被折叠的 条评论
为什么被折叠?



