本文已参与「新人创作礼」活动,一起开启掘金创作之路。
一个简单的创建和遍历二叉树的C++程序
#include <iostream>
using namespace std;
struct BiTNode{
char data;
struct BiTNode *lchild, *rchild;//左右孩子
};
BiTNode*T;
void CreateBiTree(BiTNode* &T);
void Inorder(BiTNode* &T);
void PreOrderTraverse(BiTNode* &T);
void Posorder(BiTNode* &T);
int main(){
cout<<"创建一颗树,其中A->Z字符代表树的数据,用“#”表示空树:"<<endl;
CreateBiTree(T);
cout<<"先序递归遍历:"<<endl;
PreOrderTraverse(T);
cout<<endl;
cout<<"中序递归遍历:"<<endl;
Inorder(T);
cout<<endl;
cout<<"后序递归遍历:"<<endl;
Posorder(T);
cout<<endl;
return 1;}
//=============================================先序递归创建二叉树树
void CreateBiTree(BiTNode* &T){
//按先序输入二叉树中结点的值(一个字符),空格字符代表空树,
//构造二叉树表表示二叉树T。
char ch;
if((ch=getchar())=='#')T=NULL;//其中getchar()为逐个读入标准库函数
else{
T=new BiTNode;//产生新的子树
T->data=ch;//由getchar()逐个读入来
CreateBiTree(T->lchild);//递归创建左子树
CreateBiTree(T->rchild);//递归创建右子树
}
}//CreateTree
//===============================================先序递归遍历二叉树
void PreOrderTraverse(BiTNode* &T){
//先序递归遍历二叉树
if(T){//当结点不为空的时候执行
cout<<T->data;
PreOrderTraverse(T->lchild);//
PreOrderTraverse(T->rchild);
}
else cout<<"";
}//PreOrderTraverse
//================================================中序遍历二叉树
void Inorder(BiTNode* &T){//中序递归遍历二叉树
if(T){//bt=null退层
Inorder(T->lchild);//中序遍历左子树
cout<<T->data;//访问参数
Inorder(T->rchild);//中序遍历右子树
}
else cout<<"";
}//Inorder
//=================================================后序递归遍历二叉树
void Posorder(BiTNode* &T){
if(T){
Posorder(T->lchild);//后序递归遍历左子树
Posorder(T->rchild);//后序递归遍历右子树
cout<<T->data;//访问根结点
}
else cout<<"";
}
深度优先遍历:是沿着树的深度遍历树的节点,尽可能深的搜索树的分支。
//深度优先遍历二叉树
void depthFirstSearch(Tree root){
stack<Node *> nodeStack; //使用C++的STL标准模板库
nodeStack.push(root);
Node *node;
while(!nodeStack.empty()){
node = nodeStack.top();
printf(format, node->data); //遍历根结点
nodeStack.pop();
if(node->rchild){
nodeStack.push(node->rchild); //先将右子树压栈
}
if(node->lchild){
nodeStack.push(node->lchild); //再将左子树压栈
}
}
}
广度优先遍历:是从根节点开始,沿着树的宽度遍历树的节点。如果所有节点均被访问,则算法中止。
//广度优先遍历
void breadthFirstSearch(Tree root){
queue<Node *> nodeQueue; //使用C++的STL标准模板库
nodeQueue.push(root);
Node *node;
while(!nodeQueue.empty()){
node = nodeQueue.front();
nodeQueue.pop();
printf(format, node->data);
if(node->lchild){
nodeQueue.push(node->lchild); //先将左子树入队
}
if(node->rchild){
nodeQueue.push(node->rchild); //再将右子树入队
}
}
}