二叉树遍历,先中后序遍历,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);
}

手写笔记

相关推荐
2的n次方_4 分钟前
CANN Ascend C 编程语言深度解析:异构并行架构、显式存储层级与指令级精细化控制机制
c语言·开发语言·架构
近津薪荼20 分钟前
dfs专题5——(二叉搜索树中第 K 小的元素)
c++·学习·算法·深度优先
xiaoye-duck22 分钟前
吃透 C++ STL list:从基础使用到特性对比,解锁链表容器高效用法
c++·算法·stl
_F_y27 分钟前
C++重点知识总结
java·jvm·c++
java干货36 分钟前
为什么 “File 10“ 排在 “File 2“ 前面?解决文件名排序的终极算法:自然排序
开发语言·python·算法
_F_y36 分钟前
C语言重点知识总结(含KMP详细讲解)
c语言·开发语言
毕设源码-郭学长37 分钟前
【开题答辩全过程】以 基于python的二手房数据分析与可视化为例,包含答辩的问题和答案
开发语言·python·数据分析
无小道1 小时前
Qt——常用控件
开发语言·qt
aini_lovee1 小时前
MATLAB基于小波技术的图像融合实现
开发语言·人工智能·matlab
R1nG8632 小时前
多线程安全设计 CANN Runtime关键数据结构的锁优化
开发语言·cann