二叉树的基本操作

二叉树操作任务及相关知识

第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***********/
    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小狗碎碎念

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

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

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

打赏作者

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

抵扣说明:

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

余额充值