今天大佬群里开始每天出一道数据结构的小题目,我最近也准备学习一下,所以下午闲着没事就做了一下还是很有意思的。
题目如下:
首先需要构建二叉链表结构,是一个数据域加两个指针域(左孩子跟右孩子)
这次实现的是前序遍历、中序遍历和后序遍历。
前序遍历:先是根节点,再是左子树,最后是右子树。
中序遍历:先是左子树,再是根节点,最后是右子树。
后序遍历:先是左子树,再是右子树,最后是根节点。
1、二叉链表结构:
struct bitreenode
{
char data;
struct bitreenode *leftchild;
struct bitreenode *rightchild;
};
2、创建二叉树:
void CreateBitTree(bitreenode **root)
{
char a;
cin>>a;
if(a=='#')
*root=NULL;
else
{
*root=(bitreenode *)malloc(sizeof(bitreenode));
(*root)->data=a;
CreateBitTree(&((*root)->leftchild));
CreateBitTree(&((*root)->rightchild));
}
}
3、前序遍历:
void PreorderTraverse(bitreenode *root)
{
if(root==NULL)
return;
else{
cout<<root->data;
PreorderTraverse(root->leftchild);
PreorderTraverse(root->rightchild);
}
}
4、中序遍历:
void InorderTraverse(bitreenode *root)
{
if(root==NULL)
return;
InorderTraverse(root->leftchild);
cout<<root->data;
InorderTraverse(root->rightchild);
}
5、后序遍历:
void PostorderTraverse(bitreenode *root)
{
if(root==NULL)
return;
PostorderTraverse(root->leftchild);
PostorderTraverse(root->rightchild);
cout<<root->data;
}
6、完整代码:
#include<iostream>
#include<stdlib.h>
using namespace std;
struct bitreenode
{
char data;
struct bitreenode *leftchild;
struct bitreenode *rightchild;
};
void CreateBitTree(bitreenode **root)
{
char a;
cin>>a;
if(a=='#')
*root=NULL;
else
{
*root=(bitreenode *)malloc(sizeof(bitreenode));
(*root)->data=a;
CreateBitTree(&((*root)->leftchild));
CreateBitTree(&((*root)->rightchild));
}
}
void PreorderTraverse(bitreenode *root)
{
if(root==NULL)
return;
else{
cout<<root->data;
PreorderTraverse(root->leftchild);
PreorderTraverse(root->rightchild);
}
}
void InorderTraverse(bitreenode *root)
{
if(root==NULL)
return;
InorderTraverse(root->leftchild);
cout<<root->data;
InorderTraverse(root->rightchild);
}
void PostorderTraverse(bitreenode *root)
{
if(root==NULL)
return;
PostorderTraverse(root->leftchild);
PostorderTraverse(root->rightchild);
cout<<root->data;
}
int main(void)
{
bitreenode *root=NULL;
CreateBitTree(&root);
cout<<"前序遍历:"<<endl;
PreorderTraverse(root);
cout<<endl<<"中序遍历:"<<endl;
InorderTraverse(root);
cout<<endl<<"后序遍历:"<<endl;
PostorderTraverse(root);
cout<<endl;
}
ps:这里二叉树的创建是按前序遍历的顺序创建的,输入是#是,指针指向NULL,说明是叶节点。