树的遍历是指从根结点出发,按照某种次序访问树中的所有结点,使得每个结点被访问一次且仅被访问一次。
若树为空,则空操作返回;否则
1.访问根结点
2.按照从左到右的顺序前序遍历根结点的每一棵子树。
二叉树的前序遍历
若树为空,则空操作返回;否则
1.访问根结点
2.前序遍历根结点的左子树
2.前序遍历根结点的右子树
前序遍历是指按照先根结点,再左结点,最后右结点的次序访问二叉树中所有的结点,使得每个结点被访问且仅被访问一次。
利用二叉链表表示法(即树的孩子兄弟表示法)定义树的结点数据结构
template
struct TNode
{
DataType data; //树结点元素
TNode* left; //左子树指针
TNode* right; //右子树指针
}
data为数据域,存放该结点的数据信息;
left为左指针域,存放该结点左孩子的指针,当左孩子不存在时为空指针;
right为右指针域,存放该结点右孩子的指针,当右孩子不存在时为空指针。
BiTreeNode* CreatBiTree(char* s, int &i, int len)
// 利用先序遍历创建二叉树
// 参数:先序遍历字符串s,字符串初始下标i=0,字符串长度len。
// 返回:二叉树
{
BiTreeNode* root;
char item = s[i++];
if(i>=len || item=='#')//当字符串下标上溢或者对应的位置为空时,将结点指针指向空
{
root=NULL;
}
else
{
root = new BiTreeNode(item);
root->left = CreatBiTree(s, i, len);
root->right = CreatBiTree(s, i, len);
}
return root;
}
或者
BiTreeNode* CreatBiTree(char* s,int &i,int len)
// 利用先序遍历创建二叉树
// 参数:先序遍历字符串s,字符串初始下标i=0,字符串长度len。
// 返回:二叉树
{
BiTreeNode* root;
if(s[i]=='#'||len==0||i==len){
return NULL;
}
else{
root = new BiTreeNode(s[i++]);
root->left = CreatBiTree(s,i,len);
root->right = CreatBiTree(s,++i,len);
}
return root;
}
void InOrder(BiTreeNode* root)
// 二叉树的中序遍历
// 参数:二叉树根结点root
{
if(root){ //如果root !=NULL的话执行后续操作
InOrder(root->left);
printf("%c",root->data);
InOrder(root->right);
}
}
void PreOrder(BitreeNode* root)
//二叉树的前序遍历
//参数:二叉树根结点root
{
if(root)
{
printf("%c",root->data);
PreOrder(root->left);
PreOrder(root->right);
}
void PostOrder(BitreeNode* root)
//二叉树的后序遍历
//参数:二叉树根结点root
{
if(root)
{
PreOrder(root->left);
PreOrder(root->right);
printf("%c",root->data);
}
#include
#include //注
#include
#include //注
using namespace std;
struct BiTreeNode {
char data; // 树结点元素
BiTreeNode* left; // 左子树指针
BiTreeNode* right; // 右子树指针
BiTreeNode(){ // 树结点初始化
left=NULL;
right=NULL;
}
BiTreeNode(char item){ // 用元素初始化树结点
data=item;
left=NULL;
right=NULL;
}
~BiTreeNode(){ // 释放树结点内存
left=NULL;
right=NULL;
}
};
BiTreeNode* CreatBiTree(char* s, int &i, int len)
// 利用先序遍历创建二叉树
// 参数:先序遍历字符串s,字符串初始下标i=0,字符串长度len。
// 返回:二叉树
{
BiTreeNode* root;
char item = s[i++];
if(i>=len || item=='#')
{
root=NULL;
}
else
{
root = new BiTreeNode(item);
root->left = CreatBiTree(s, i, len);
root->right = CreatBiTree(s, i, len);
}
return root;
}
/*
BiTreeNode* CreatBiTree(char* s,int &i,int len)
// 利用先序遍历创建二叉树
// 参数:先序遍历字符串s,字符串初始下标i=0,字符串长度len。
// 返回:二叉树
{
BiTreeNode* root;
if(s[i]=='#'||len==0||i==len){
return NULL;
}
else{
root = new BiTreeNode(s[i++]);
root->left = CreatBiTree(s,i,len);
root->right = CreatBiTree(s,++i,len);
}
return root;
}
*/
void InOrder(BiTreeNode* root)
// 二叉树的中序遍历
// 参数:二叉树根结点root
// 输出:中间没有空格,末尾不换行。
{
if(root){
InOrder(root->left);
printf("%c",root->data);
InOrder(root->right);
}
}
int main(int argc, const char * argv[]) {
char str[200];
scanf("%s", str);
int i = 0;
int len = int(strlen(str));
BiTreeNode* root = CreatBiTree(str, i, len);
InOrder(root);
return 0;
}
测试文件:
测试输入:ABC##D##EF###
预期输出:CBDAFE
测试输入:ABCD###E#F##G##
预期输出:DCBEFAG
注:
1.#include< cstdio>
cstdio是将stdio.h的内容用C++头文件的形式表示出来。stdio.h是C标准函数库中的头文件,即:standard buffered input&output。提供基本的文字的输入输出流操作(包括屏幕和文件等)。由于C语言并没有提供专用于文字输入输出的关键字,所以该库是最普遍的C语言程序加载库。
使用方法
stdio.h是以往的C和C++的头文件,cstdio是标准C++(STL),且cstdio中的函数都是定义在一个名称空间std里面的,如果要调用这个名字空间的函数,必须得加std::或者在文件中声明using namespace std。
#include
using namespace std;/*你也可以同时加上这个语句*/
2.#include< algorithm>
algorithm意为"算法",是C++的标准模版库(STL)中最重要的头文件之一,提供了大量基于迭代器的非成员模板函数。
参考:https://www.educoder.net/ 中的数据结构实验题