二叉树遍历,先中后序遍历,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 小时前
Java Compiler API使用
java·开发语言·python
M__332 小时前
动规入门——斐波那契数列模型
数据结构·c++·学习·算法·leetcode·动态规划
wangchen_02 小时前
C/C++时间操作(ctime、chrono)
开发语言·c++
Dev7z2 小时前
基于MATLAB HSI颜色空间的图像美颜系统设计与实现
开发语言·matlab
superman超哥2 小时前
仓颉语言中字符串常用方法的深度剖析与工程实践
开发语言·后端·python·c#·仓颉
想学后端的前端工程师2 小时前
【Spring Boot微服务开发实战:从入门到企业级应用】
java·开发语言·python
setary03012 小时前
FastDDS之共享内存
c++
刺客-Andy2 小时前
js高频面试题 50道及答案
开发语言·javascript·ecmascript
ShineSpark2 小时前
eventpp 全面教程(从入门到实战)
c++·后端