参考视频
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 就能得到总结点数。
三、满二叉树与完全二叉树
- 满二叉树:叶子都在最后一层,且每个非叶子结点都有两个孩子(按从左到右顺序)
- 完全二叉树:叶子节点只能在最后两层,且最后一层的结点从左到右连续排列
二叉树还有两个常用性质:
- 对于度为 m 的树,第 i 层最多有
m^(i-1)个结点 - 对于高度为 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);
}
手写笔记




