C++實現樹(前序,中序,后序,層序遍歷)


practice1.h文件

#ifndef PRACTICE_H_INCLUDED
#define PRACTICE_H_INCLUDED
#include <iostream>
#include <queue>
template<class T>   class  BinaryTree;

template<class T>
class  TreeNode
{
public:
    TreeNode()
    {

        leftChild=NULL;
        rightChild=NULL;
    }
    T data;
    TreeNode<T> *leftChild;
    TreeNode<T> *rightChild;

};

template<class T>
class BinaryTree
{
public:
    //對二叉樹進行的操作
    void InOrder();
    void InOrder(TreeNode<T> * currentNode);
    void PreOrder();
    void PreOrder(TreeNode<T> * currentNode);
    void PostOrder();
    void PostOrder(TreeNode<T> * currentNode);
    void LevalOrder();
    void Visit(TreeNode<T> *currentNode);
public:
    TreeNode<T> *root;
};

template<class T>
void BinaryTree<T>::InOrder()//中序遍歷 左中右
{
     InOrder(root);


}
template <class T>
void BinaryTree<T>::Visit(TreeNode<T>* currentNode)
{


    std::cout<<currentNode->data;
}
template<class T>
void BinaryTree<T>::InOrder(TreeNode<T> *currentNode)
{


    if(currentNode)
    {

        InOrder(currentNode->leftChild);
        Visit(currentNode);
        InOrder(currentNode->rightChild);
    }
}

template<class T>
void BinaryTree<T>::PreOrder()
{

    PreOrder(root);
}

template<class T>
void BinaryTree<T>::PreOrder(TreeNode<T> *currentNode)
{
    if(currentNode)
    {

        Visit(currentNode);
        PreOrder(currentNode->leftChild);
        PreOrder(currentNode->rightChild);
    }
}

template<class T>
void BinaryTree<T>::PostOrder()//后序遍歷
{

    PostOrder(root);
}

template<class T>
void BinaryTree<T>::PostOrder(TreeNode<T> *currentNode)
{
    if(currentNode)
    {
        PostOrder(currentNode->leftChild);
        PostOrder(currentNode->rightChild);
        Visit(currentNode);

    }
}
template<class T>
void BinaryTree<T>::LevalOrder()//層序遍歷  顯示一個之前先把其左右孩子放到隊列里
{
    std::queue<TreeNode<T>*> q;     //創建隊列    隊列中放的是樹節點的指針
    TreeNode<T>* currentNode=root;
    while(currentNode)
    {

        Visit(currentNode);
        if(currentNode->leftChild) q.push(currentNode->leftChild);  //入隊列
        if(currentNode->rightChild) q.push(currentNode->rightChild);//入隊列
        if(q.empty())  return;
        currentNode=q.front();//將隊列頭記下,將左右孩子入隊列
        q.pop();//出隊頭
    }

}

#endif // PRACTICE_H_INCLUDED

practice.cpp

#include<iostream>

#include "practice1.h"


using namespace std;

int main()
{

    BinaryTree<char> tree;
    TreeNode<char> f,g,h,i,a,b,c,d,e;
    f.data='+';
    g.data='-';
    h.data='*';
    i.data='/';
    a.data='A';
    b.data='B';
    c.data='C';
    d.data='D';
    e.data='E';

    tree.root=&f;
    f.leftChild=&g;
    f.rightChild=&e;
    g.leftChild=&h;
    g.rightChild=&d;
    h.leftChild=&i;
    h.rightChild=&c;
    i.leftChild=&a;
    i.rightChild=&b;
   cout<<"中序遍歷"<<endl;
   tree.InOrder();//中序遍歷
   cout<<"\n"<<endl;
   cout<<"前序遍歷"<<endl;
   tree.PreOrder();
   cout<<"\n"<<endl;
   cout<<"后序遍歷"<<endl;
   tree.PostOrder();
   cout<<"\n"<<endl;
   cout<<"層序遍歷"<<endl;
   tree.LevalOrder();
    return 0;
}











//二叉查找樹   左邊子樹都比根節點小 ,右邊都比根節點大

//數組實現二叉樹   容易造成比較多的空間浪費

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM