头歌_二叉树

第一关:

第一关
#pragma once
# include <bits/stdc++.h>
using namespace std;

namespace exa{

struct bnode {
    struct bnode * lchild, * rchild;
    char data;
};
typedef bnode * bitre;

//读取扩展二叉树的先序序列来构建原二叉树
static void load_bitre(bitre & t) {
     char c;
        scanf("%c", &c);
        if (c == '.')
        {
            t = NULL;//指针为空
            return;
        }
        else
        {
            bitre temp = (bitre)malloc(sizeof(struct bnode));//分配新地址
            if (!temp) return;//分配不成功
            temp->data = c;
            t = temp;
            load_bitre(t->lchild);
            load_bitre(t->rchild);
        }
}

//输出二叉树的先序和后序遍历序列
//输出格式为:
//PreOrder: xxxxxxx
//InOrder: xxxxxxx
 static void pre(bitre t) {
        printf("%c", t->data);
        if (t->lchild) pre(t->lchild);
        if (t->rchild) pre(t->rchild);
    }
    static void mid(bitre t) {
        if (t->lchild) mid(t->lchild);
        printf("%c", t->data);
        if (t->rchild) mid(t->rchild);
    }
    static void display_bitre(bitre& root) {
        printf("PreOrder: ");
        pre(root);//先序,根左右
        printf("\n");
        printf("InOrder: ");
        mid(root);//中序,左根右
    }

}
第二关
#include "test.h"
#include "../btrechar.h"  // 引用库函数文件
namespace exa {     //请在命名空间内编写代码,否则后果自负

void visite_leaf(bitre t)
{
        if (t != NULL)//Blank 1
        {
            if (t->lchild == NULL && t->rchild == NULL) {
                cout << endl;
                cout << t->data;
            }
            visite_leaf(t->lchild);                 // 递归调用算法对左子树执行
            visite_leaf(t->rchild);                 // 递归调用算法对右子树执行
        }
}
void solve()
{
    bitre t;
    load_bitre(t);                              // 取出二叉树
    display_bitre(t);                   // 显示二叉树
    visite_leaf(t);                             // 调用算法运行以检验
}

}
第三关
#include "test.h"
#include "../btrechar.h"  // 引用库函数文件
namespace exa {     //请在命名空间内编写代码,否则后果自负

void bitrepreorder(bitre t)
{
    if (t != NULL){
         putchar(t->data);

        bitrepreorder(t->lchild);       // 递归调用算法对t的左子树执行算法
       
        bitrepreorder(t->rchild);       // 递归调用算法对t的右子树执行算法
    }
}
void solve()
{
    bitre t;
    load_bitre(t);
    display_bitre(t);
    cout<<endl;
    bitrepreorder(t);
    puts("");
}

}
第四关
#include "test.h"
#include "../btrechar.h"  // 引用库函数文件
namespace exa {     //请在命名空间内编写代码,否则后果自负
#define MAX(a,b)((a)>(b)?(a):(b))
int solve(bitre & t) {

       if (t == NULL) return 0;
        int len = 0;
        if (t->lchild)
        {
            int lh = solve(t->lchild);
            len = MAX(lh, len);
        }
        if (t->rchild)
        {
            int rh = solve(t->rchild);
            len = MAX(len, rh);
        }
        return len + 1;
}

}
第五关
#include "test.h"
#include "../btrechar.h"  // 引用库函数文件
namespace exa {     //请在命名空间内编写代码,否则后果自负

int cnt = 1;
	//中序遍历,左根右
	void solve(bitre& t) {
		if (t == NULL) return;
		cnt++;
		if (t->lchild) solve(t->lchild);
		printf("%c %d\n", t->data, cnt - 1);//因为这个点为子树头结点
		if (t->rchild) solve(t->rchild);
		cnt--;//一定要加,回溯
	}

}
第六关
#include "test.h"
#include "../btrechar.h"  // 引用库函数文件
namespace exa {     //请在命名空间内编写代码,否则后果自负

    bitre Create(char*, int, int);
    bitre solve(char* c, int n) {
        return Create(c, 0, n);
    }
    bitre Create(char* c, int i, int n)
    {//建树
        bitre temp = NULL;//创建新空指针
        if (i < n && c[i] != '.')
        {
            temp = (bitre)malloc(sizeof(struct bnode));//分配内存
            temp->data = c[i];//头
            temp->lchild = Create(c, 2 * i + 1, n);//递归创建左子树
            temp->rchild = Create(c, 2 * i + 2, n);
        }
        return temp;
    }
}
第七关
#include "test.h"
#include "../btrechar.h"  // 引用库函数文件
namespace exa {     //请在命名空间内编写代码,否则后果自负

bitre solve(bitre & t) {
  if(t==NULL) return NULL;
    bitre newt=new bnode();//创建新指针
    newt->data=t->data;
    newt->lchild=solve(t->lchild);
    newt->rchild=solve(t->rchild);
    return newt;
}

}
第八关
#include "test.h"
#include "../btrechar.h"  // 引用库函数文件
namespace exa {     //请在命名空间内编写代码,否则后果自负


void solve(bitre & t) {
 if(t==NULL) return;
    if(t->lchild) solve(t->lchild);
    if(t->rchild) solve(t->rchild);
    bitre temp=t->lchild;
    t->lchild=t->rchild;
    t->rchild=temp;
}

}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 先序遍历创建二叉链表存储的二叉树是指按照先序遍历的顺序依次创建二叉树,并用链表的方式存储。具体操作是先读入一个节点的值,如果该节点的值不为空,则创建该节点,并递归创建其左右子树;如果该节点的值为空,则返回上一层递归。遍历操作包括先序遍历、中序遍历和后序遍历,分别是按照根节点、左子树、右子树的顺序遍历、按照左子树、根节点、右子树的顺序遍历、按照左子树、右子树、根节点的顺序遍历。 ### 回答2: 二叉链表是一种常见的二叉树存储方式。在二叉链表中,每个节点都包括一个数据域,以及指向左右子节点的指针。通过指针,我们能够在树中方便地进行遍历等操作。 先序遍历创建二叉链表存储的二叉树的过程如下: 1. 读入一个节点的信息,包括节点的数据和指向其左右子节点的指针。 2. 如果指针指向的是空节点,说明此节点是叶子节点,直接将指针设为空。否则,递归调用函数,读入左右子节点信息。 3. 在递归调用返回后,将指针指向已创建的左右子树。 4. 重复以上过程,直到读到节点数据的结束标志。 在先序遍历创建的过程中,由于我们先读入父节点,所以可以方便地进行遍历操作。先序遍历的顺序是根节点,左子树,右子树。因此,遍历操作可以按照以下过程进行: 1. 访问当前节点的数据域。 2. 如果当前节点的左子树非空,递归遍历左子树。 3. 如果当前节点的右子树非空,递归遍历右子树。 使用递归实现先序遍历的代码如下: ``` void preorderTraversal(BTNode* root) { if(root == NULL) { // 如果树为空,直接返回 return; } printf("%d ", root->data); // 访问当前节点的数据域 preorderTraversal(root->left); // 递归遍历左子树 preorderTraversal(root->right); // 递归遍历右子树 } ``` 除了先序遍历外,还有中序遍历和后序遍历。它们的遍历顺序分别为左子树,根节点,右子树;根节点,左子树,右子树;左子树,右子树,根节点。同样地,它们也可以通过递归实现。在实际程序中,我们常常需要根据具体的需求选择不同的遍历方式。 ### 回答3: 在二叉树的创建和遍历操作中,先序遍历是指在遍历时,先访问节点本身,然后再遍历它的左子树和右子树。这样的遍历顺序就是先序遍历的顺序。在先序遍历中,对于该节点本身而言,先对其进行访问和处理,再对其左子树进行遍历操作,最后再对其右子树进行遍历操作。先序遍历的遍历顺序是根-左-右。 在使用先序遍历创建二叉树的过程中,需要按照先序遍历的顺序输入节点的值,如果该节点存在左子树,则先对左子树进行遍历,否则遍历完成。如果存在右子树,则对右子树进行遍历。按照这种方式,就可以自适应地创建出一棵二叉树。 在先序遍历创建完成二叉树之后,可以使用先序遍历、中序遍历和后序遍历等方法对其进行遍历操作。其中,先序遍历是指按照根-左-右的遍历顺序进行遍历操作,中序遍历是指按照左-根-右的遍历顺序进行遍历操作,后序遍历是指按照左-右-根的遍历顺序进行遍历操作。 在遍历完成后,可以对二叉树进行一系列的操作,例如求二叉树的深度、查找二叉树中是否存在某个元素、删除二叉树中的某个节点等。这些操作都基于遍历算法实现,因此对于遍历算法的理解和掌握是非常重要的。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值