二叉树遍历,先中后序遍历,c++版

参考视频

7.表达式求值_树开头_哔哩哔哩_bilibili1小时15分钟到最后

8.二叉树与遍历_哔哩哔哩_bilibili一整节,只听前中后序遍历大概在中间

6-19 先序遍历二叉树

分数 5

作者 黄龙军

单位 绍兴文理学院

要求实现函数,输出二叉树的先序遍历序列。二叉树采用二叉链表存储,结点结构如下:

复制代码
struct BiTNode {               // 结点结构
    char data;                 // 结点数据域
    BiTNode *lchild, *rchild;  // 左、右孩子指针
};

函数接口定义:

复制代码
void PreOrder(BiTNode *T);

其中参数 T是指向二叉树根结点的指针。

裁判测试程序样例:

复制代码
#include<iostream>
#include<string>
using namespace std;

struct BiTNode {
    char data;
    BiTNode *lchild, *rchild;
};

void PreOrder(BiTNode *T);           //先序遍历
BiTNode *CreateBiTree(string &s);  // 创建二叉树,s存放带虚结点的先序遍历序列

int main() {
    string s;
    while(cin>>s) {
        BiTNode* root=CreateBiTree(s);
        PreOrder(root);
        cout<<endl;
    }    
    return 0;
}

// 请在此处填写答案

// 按字符串s创建二叉树,返回根结点指针
BiTNode *CreateBiTree(string &s) {
    if(s[0]=='*') {
        s=s.substr(1);
        return NULL; 
    }
    BiTNode *p=new BiTNode;
    p->data=s[0];
    s=s.substr(1);
    p->lchild=CreateBiTree(s);
    p->rchild=CreateBiTree(s);
    return p;
}

输入样例:

复制代码
HDA**C*B**GF*E***
-+a**xb**-c**d**/e**f**

输出样例:

复制代码
HDACBGFE
-+axb-cd/ef

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

cpp 复制代码
void PreOrder(BiTNode *T){
    if(T==NULL){
        return;
    }
    cout<<T->data;
    PreOrder(T->lchild);
    PreOrder(T->rchild);
}

6-18 中序遍历二叉树

分数 5

作者 黄龙军

单位 绍兴文理学院

要求实现函数,输出二叉树的中序遍历序列。二叉树采用二叉链表存储,结点结构如下:

复制代码
struct BiTNode {               // 结点结构
    char data;                 // 结点数据域
    BiTNode *lchild, *rchild;  // 左、右孩子指针
};

函数接口定义:

复制代码
void InOrder(BiTNode *T);

其中参数 T是指向二叉树根结点的指针。

裁判测试程序样例:

复制代码
#include<iostream>
#include<string>
using namespace std;

struct BiTNode {
    char data;
    BiTNode *lchild, *rchild;
};

void InOrder(BiTNode *T);           //中序遍历
BiTNode *CreateBiTree(string &s);  // 创建二叉树,s存放带虚结点的先序遍历序列

int main() {
    string s;
    while(cin>>s) {
        BiTNode* root=CreateBiTree(s);
        InOrder(root);
        cout<<endl;
    }    
    return 0;
}

// 请在此处填写答案

// 按字符串s创建二叉树,返回根结点指针
BiTNode *CreateBiTree(string &s) {
    if(s[0]=='*') {
        s=s.substr(1);
        return NULL; 
    }
    BiTNode *p=new BiTNode;
    p->data=s[0];
    s=s.substr(1);
    p->lchild=CreateBiTree(s);
    p->rchild=CreateBiTree(s);
    return p;
}

输入样例:

复制代码
HDA**C*B**GF*E***
-+a**xb**-c**d**/e**f**

输出样例:

复制代码
ADCBHFEG
a+bxc-d-e/f

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

C++ (g++)

cpp 复制代码
void InOrder(BiTNode *T){
    if(T==NULL){
        return;
    }
    InOrder(T->lchild);
    cout<<T->data;
    InOrder(T->rchild);
}

6-20 后序遍历二叉树

分数 5

作者 黄龙军

单位 绍兴文理学院

要求实现函数,输出二叉树的后序遍历序列。二叉树采用二叉链表存储,结点结构如下:

复制代码
struct BiTNode {               // 结点结构
    char data;                 // 结点数据域
    BiTNode *lchild, *rchild;  // 左、右孩子指针
};

函数接口定义:

复制代码
void PostOrder(BiTNode *T);

其中参数 T是指向二叉树根结点的指针。

裁判测试程序样例:

复制代码
#include<iostream>
#include<string>
using namespace std;

struct BiTNode {
    char data;
    BiTNode *lchild, *rchild;
};

void PostOrder(BiTNode *T);         //后序遍历
BiTNode *CreateBiTree(string &s);  // 创建二叉树,s存放带虚结点的先序遍历序列

int main() {
    string s;
    while(cin>>s) {
        BiTNode* root=CreateBiTree(s);
        PostOrder(root);
        cout<<endl;
    }    
    return 0;
}

// 请在此处填写答案

// 按字符串s创建二叉树,返回根结点指针
BiTNode *CreateBiTree(string &s) {
    if(s[0]=='*') {
        s=s.substr(1);
        return NULL; 
    }
    BiTNode *p=new BiTNode;
    p->data=s[0];
    s=s.substr(1);
    p->lchild=CreateBiTree(s);
    p->rchild=CreateBiTree(s);
    return p;
}

输入样例:

复制代码
HDA**C*B**GF*E***
-+a**xb**-c**d**/e**f**

输出样例:

复制代码
ABCDEFGH
abcd-x+ef/-

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

cpp 复制代码
void PostOrder(BiTNode *T){
    if(T==NULL){
        return;
    }    
    PostOrder(T->lchild);
    PostOrder(T->rchild);
    cout<<T->data;
}

前置知识点

一、树的基本概念

树是由多个结点组成的有限集合,存在一个 "根" 结点,其余结点被分成若干互不相交的集合(每个集合都是一棵树,称为根的子树)。

几个核心术语:

  • 结点:树中的独立单元
  • 结点的度:结点拥有的子树数量(比如 A 有 3 个度,B 有 2 个度)
  • 树的度:树内所有结点度的最大值
  • 叶子:度为 0 的结点(终端结点)
  • 非终端结点:度不为 0 的结点
  • 双亲与孩子:结点的子树根是该结点的孩子,对应结点是孩子的双亲
  • 层次:从根开始定义,根是第一层,根的孩子是第二层,以此类推

二、树的基本性质

树有个重要性质:树中所有结点数等于所有结点的度数之和加 1

举个例子,像笔记里的树,统计所有结点的度数并求和,再加 1 就能得到总结点数。

三、满二叉树与完全二叉树

  • 满二叉树:叶子都在最后一层,且每个非叶子结点都有两个孩子(按从左到右顺序)
  • 完全二叉树:叶子节点只能在最后两层,且最后一层的结点从左到右连续排列

二叉树还有两个常用性质:

  1. 对于度为 m 的树,第 i 层最多有m^(i-1)个结点
  2. 对于高度为 h、度为 m 的树,最多有(m^h - 1)/(m-1)个结点

四、二叉树的存储与遍历

二叉树常用链式存储,结点结构定义如下:

c

复制代码
typedef char ElemType;
typedef struct TreeNode
{
    ElemType data;
    TreeNode *lchild;
    TreeNode *rchild;
}TreeNode;
typedef TreeNode* BiTree;

前序遍历(根→左→右)的实现代码:

c

复制代码
void preOrder (BiTree T)
{
    if (T == NULL)
    {
        return;
    }
    printf("%c", T->data);
    preOrder (T->lchild);
    preOrder (T->rchild);
}

手写笔记

相关推荐
biter down5 小时前
14:pytest-order 插件 顺序控制案例
开发语言·python·pytest
郝学胜-神的一滴5 小时前
Qt 高级开发 009: C++ Lambda 表达式
开发语言·c++·qt·软件构建
星栈独行5 小时前
我在 Rust 全栈项目里用 JWT 做无状态认证
开发语言·后端·rust·前端框架·开源·github·web
石山代码5 小时前
C++ 轻量级日志系统
开发语言·c++
小技与小术6 小时前
玩转Flask
开发语言·python·flask
SilentSamsara6 小时前
Python 性能优化:tracemalloc、profiling 与 C 扩展加速
开发语言·python·青少年编程·性能优化
冰小忆6 小时前
大驼峰命名规范和小驼峰命名规范的区别是什么?
开发语言·python
এ慕ོ冬℘゜8 小时前
JS 前端基础面试题
开发语言·前端·javascript
浩少7028 小时前
【无标题】
java·开发语言
nnsix8 小时前
C# 字符串 根据换行符分割
开发语言·c#