二叉树的前序、中序、后序、层序遍历

来源:互联网 发布:pk10网站源码 编辑:程序博客网 时间:2024/06/07 00:21

1、二叉树是N(N>=0)个节点的有限集合,该集合或者为空集(空二叉树),或者由一个根节点和两棵互不相交的、分别称为根节点的的左子树和右子树的二叉树组成;
这里写图片描述

#pragma once#include <vector>#include <queue>#include <iostream>#include <assert.h>using namespace std;typedef char DataType;struct BinaryNode{    BinaryNode* _left;    BinaryNode* _right;    DataType _data;    BinaryNode(DataType x)        :_left(NULL)        ,_right(NULL)        ,_data(x)    {}};void CreateBinaryTree(BinaryNode*& root,                       const vector<DataType>& datas,                      int & i){    // 前序遍历构建二叉树    if (root == NULL && i < datas.size() && datas[i] != '#')    {        root = new BinaryNode(datas[i]);        CreateBinaryTree(root->_left, datas, ++i);        CreateBinaryTree(root->_right, datas, ++i);    }}//前序遍历void PrevTraverse(BinaryNode* root){    if (root)    {        cout<<root->_data<<" ";        PrevTraverse(root->_left);        PrevTraverse(root->_right);    }}//中序遍历void InTraverse(BinaryNode* root){    if (root)    {        InTraverse(root->_left);        cout<<root->_data<<" ";        InTraverse(root->_right);    }}//后序遍历void PostTraverse(BinaryNode* root){    if (root)    {        PostTraverse(root->_left);        PostTraverse(root->_right);        cout<<root->_data<<" ";    }}//层序遍历void cengTraverse(BinaryNode *root){    queue<BinaryNode> q;    q.push(*root);    while(!q.empty())    {        *root = q.front();        cout<<root->_data<<" ";        q.pop();        if(root->_left != NULL)        {            q.push(*root->_left);        }        if(root->_right != NULL)        {            q.push(*root->_right);        }    }}
void Test1(){    vector<DataType> v;    v.push_back('A');    v.push_back('B');    v.push_back('C');    v.push_back('#');    v.push_back('#');    v.push_back('D');    v.push_back('#');    v.push_back('#');    v.push_back('E');    v.push_back('F');    BinaryNode* root = NULL;    int index = 0;    CreateBinaryTree(root, v, index);    PrevTraverse(root);    cout<<endl;    InTraverse(root);    cout<<endl;    PostTraverse(root);    cout<<endl;    cengTraverse(root);    cout<<endl;}int main(){    Test1();    return 0;}
运行结果前序:A B C D E F中序:C B D A F E 后序:C D B F E A层序:A B E C D F 
0 0