c++ 前、中、后、层次遍历完全二叉树

#include<iostream>
#include<vector>
using namespace std;
//二叉树结点结构  
typedef struct BiTNode{
    char ch;            //结点数据  
    struct BiTNode *lchild;        //左孩子  
    struct BiTNode *rchild;        //右孩子  
}BiTNode, *BiTree;


BiTree AddBiTree();//按层遍历创建完全二叉树  
void PreOrderTraverse(BiTNode *); //前序遍历  
void InOrderTraverse(BiTNode *);   //中序遍历  
void PostOrderTraverse(BiTNode *);  //后序遍历 
void LevelOrderTraverse(BiTNode *);//层次遍历
void PreOrderTraverseWithLevel(BiTree T, int level, vector<vector<BiTree>>&);


int main()
{
    BiTree root;
    root = AddBiTree();
    //输出遍历结果  
    cout << "前序遍历:\n";
    PreOrderTraverse(root);
    cout << "\n中序遍历:\n";
    InOrderTraverse(root);
    cout << "\n后序遍历:\n";
    PostOrderTraverse(root);
    cout << "\n层次遍历:\n";
    LevelOrderTraverse(root);
    return 0;
}
//按层遍历创建完全二叉树   
BiTree AddBiTree()
{
    vector<BiTree> trees;
    for (int i = 0; ; i++)
    {
        char c;
        cin >> c;
        if (c=='#')//c等于回车跳出for循环
        {
            break;
        }
        BiTree tree = new BiTNode();
        tree->ch = c;//指针为->,对象为.
        tree->lchild = NULL;
        tree->rchild = NULL;
        trees.push_back(tree);
    }
    for (int i = trees.size()-1;i>0; i--)//从下往上遍历
    {
        if (i % 2 != 0)//奇数
        {
            trees[(i - 1) / 2]->lchild = trees[i];
        }
        else//偶数
        {
          trees[(i - 1) / 2]->rchild = trees[i];
        }
    }
    return trees[0];//返回根节点
}


//前序遍历  
void PreOrderTraverse(BiTree T)
{
    if (T){
        cout << T->ch << " ";
        PreOrderTraverse(T->lchild);
        PreOrderTraverse(T->rchild);
    }
}

//中序遍历  
void InOrderTraverse(BiTree T)
{
    if (T){
        InOrderTraverse(T->lchild);
        cout << T->ch << " ";
        InOrderTraverse(T->rchild);
    }
}

//后序遍历  
void PostOrderTraverse(BiTree T)
{
    if (T){
        PostOrderTraverse(T->lchild);
        PostOrderTraverse(T->rchild);
        cout << T->ch << " ";
    }
}
//层次遍历 
void LevelOrderTraverse(BiTree T){
    if (T)
    {
        vector<vector<BiTree>> vec;
        PreOrderTraverseWithLevel(T, 0, vec);
        for (int i = 0; i < vec.size(); i++)
        {
            for (int j = 0; j < vec[i].size(); j++)
            {
                cout << vec[i][j]->ch << " ";
            }
            cout << endl;
        }
    }

}


void PreOrderTraverseWithLevel(BiTree T, int level, vector<vector<BiTree>>& vec)
{
    if (T){
        if (vec.size()<level+1){
            vector<BiTree> arr;
            vec.push_back(arr);
        }
        vec[level].push_back(T);
        PreOrderTraverseWithLevel(T->lchild, level + 1, vec);
        PreOrderTraverseWithLevel(T->rchild, level + 1, vec);
    }
}

这里写图片描述

猜你喜欢

转载自blog.csdn.net/cristina_song/article/details/78450878