C++ 创建和遍历二叉树

807 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

一个简单的创建和遍历二叉树的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);  //再将右子树入队
        }
    }
}