1. 程式人生 > >C++資料結構 16 二叉樹

C++資料結構 16 二叉樹

樹集成了陣列和連結串列的優點(查詢速度快)

樹:結點,度,葉結點,父結點,子結點,兄弟結點,樹的度,樹的高度。

具體概念可以參考:https://blog.csdn.net/u012928324/article/details/61194190?utm_source=itdadao&utm_medium=referral

 


#ifndef _BinaryTree_H__
#define _BinaryTree_H__
#include<iostream>
#include <queue>
using namespace std;
template<class T> class Binary_Tree;

template <class T>
class TreeNode   //樹節點
{
   public:
       TreeNode()
       {
         leftchild=rightchild=NULL;
       }
       T data;                  //資料
       TreeNode<T>* leftchild;  //左孩子
       TreeNode<T>*rightchild;  //右孩子
};

template <class T>
class Binary_Tree  //樹
{
public:
  void InOrder();   //中序遍歷   左子樹-節點-右子樹
  void PreOrder();  //前序遍歷   節點-左子樹-右子樹
  void PostOrder();  //後序遍歷   左子樹-右子樹-節點
  void LevelOrder();  //層序遍歷

  void InOrder(TreeNode<T>*CurrentNode);  //顯示當前節點
  void PreOrder(TreeNode<T>*CurrentNode);
  void PostOrder(TreeNode<T>*CurrentNode);
  void Vivit(TreeNode<T>*CurrentNode);
  TreeNode<T>*root;  //根
};

template<class T>
void Binary_Tree<T>::InOrder()  //中序遍歷  左子樹-節點-右子樹
{
   InOrder(root);
}

template<class T>
void Binary_Tree<T>::Vivit(TreeNode<T>*CurrentNode)//顯示節點或處理資料
{
   cout<<CurrentNode->data;
}
template<class T>
void Binary_Tree<T>::InOrder(TreeNode<T>*CurrentNode)
{
   if(CurrentNode)  //如果當前節點不為空
   {
       InOrder(CurrentNode->leftchild);  //先遍歷左節點
       Vivit(CurrentNode);               //顯示當前節點
       InOrder(CurrentNode->rightchild); //再遍歷右節點
   }
}

template<class T>
void Binary_Tree<T>::PreOrder()  //前序
{
  PreOrder(root);
}

template<class T>
void Binary_Tree<T>::PreOrder(TreeNode<T>*CurrentNode)//前序遍歷
{
  if(CurrentNode)
  {
      Vivit(CurrentNode);
      PreOrder(CurrentNode->leftchild);   //左邊
      PreOrder(CurrentNode->rightchild);  //右邊
  }
}

template<class T>
void Binary_Tree<T>::PostOrder()  //後序遍歷
{
  PostOrder(root);
}

template<class T>
void Binary_Tree<T>::PostOrder(TreeNode<T>*CurrentNode)//後序遍歷
{
    if(CurrentNode)
    {
      PostOrder(CurrentNode->leftchild);
      PostOrder(CurrentNode->rightchild);
      Vivit(CurrentNode);
    }
}

template<class T>
void Binary_Tree<T>::LevelOrder() //層序遍歷
{
   queue<TreeNode<T>*>  q;
   TreeNode<T> *currentNode=root;
   while(currentNode)
   {
       Vivit(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 // _BinaryTree_H__

main
 

#include <iostream>
#include "BinaryTree.h"
using namespace std;

int main()
{
    Binary_Tree<char> P;
    TreeNode<char> add,sub,mul,div,a,b,c,d,e,tree;;

     add.data='+';
     sub.data='-';
     mul.data='*';
     div.data='/';

     a.data='A';
     b.data='B';
     c.data='C';
     d.data='D';
     e.data='E';

     P.root=&add;
     add.leftchild=&sub;
     add.rightchild=&e;
     sub.leftchild=&mul;
     sub.rightchild=&d;
     mul.leftchild=&div;
     mul.rightchild=&c;
     div.leftchild=&a;
     div.rightchild=&b;

     cout << "中序遍歷:";
     P.InOrder();  //中序遍歷
     cout<<endl;
    //
    cout << "前序遍歷:";
     P.PreOrder();  //中序遍歷
     cout<<endl;

    cout << "後序遍歷:";
     P.PostOrder();  //中序遍歷
     cout<<endl;

     cout << "層序遍歷:";
     P.LevelOrder();
    return 0;
}