二叉樹的先序遞歸以及非遞歸遍歷

//***********************************BinaryTree.h********************************************

//此代碼只實現了二叉樹先序遍歷的遞歸以及非遞歸算法,再就是層次遍歷算法

#include <iostream>
#include <stack>                                                  //調用STL中的stack模板類
#include <queue>

using namespace std;

template <class T>
class BinaryTree;

template <class T>
class TreeNode
{
 friend class BinaryTree<T>;
private:
 TreeNode<T> *left,*right;
 T data;
public:
 TreeNode(T d,TreeNode<T> *l=NULL,TreeNode<T> *r=NULL):data(d),left(l),right(r){}
};

template <class T>
class BinaryTree
{
private:
 TreeNode<T> *root;                         //二叉樹的根節點
public:
 BinaryTree()                               //構造函數
 {
  root=createTree();
 }
 ~BinaryTree()                              //析構函數
 {
  cout<<"調用析構函數!"<<endl;
  clearTree(root);                       //調用清空二叉樹函數
 }
 TreeNode<T>* createTree()                  //先序遞歸創建二叉樹
 {
  static int i=1;
        TreeNode<T>* Root;
  cout<<"請輸入二叉樹的先序遍歷的第"<<i++<<"個值:";
  T info;
  cin>>info;
  if(info!='#')                          //葉子節點控制符
     {
    
         Root=new TreeNode<T>(info);
      Root->left=createTree();
   Root->right=createTree();
     }
  else
      Root=NULL;
  return Root;
 }
 void preOrderI(TreeNode<T> *Root)                          //先序遞歸遍歷二叉樹並輸出
 {
  if(Root!=NULL)
  {
   cout<<Root->data<<" ";
   preOrderI(Root->left);
   preOrderI(Root->right);
  }
  else                                                 //二叉樹爲空時
  {
   if(root==NULL)
   {
    cout<<"二叉樹爲空"<<endl;
   }
  }
  //cout<<endl;
 }

 void preOrderII()                                        //非遞歸先序遍歷二叉樹
 {
  stack<TreeNode<T>*> Stack;
  TreeNode<T>* Root;
  Stack.push(root);
  while(!Stack.empty())
  {
   Root=Stack.top();
   Stack.pop();
   cout<<Root->data<<" ";
   if(Root->right!=NULL)
    Stack.push(Root->right);
   if(Root->left!=NULL)
    Stack.push(Root->left);
  }
 }
   
 void levelOrder()
 {
  queue<TreeNode<T>*> Queue;
  TreeNode<T> *Root;
  Queue.push(root);
  while(!Queue.empty())
  {
   Root=Queue.front();
            Queue.pop();
   cout<<Root->data<<" ";
   if(Root->left!=NULL)
    Queue.push(Root->left);
   if(Root->right!=NULL)
    Queue.push(Root->right);
  }
 }

 void clearTree(TreeNode<T>* Root)                       //清空二叉樹,root=NULL
 {
  removeNode(Root);
  root=NULL;
 }
 void removeNode(TreeNode<T> *Root)                      //包括根節點在內的子節點全部刪除
 {
  if(Root!=NULL)
  {
   removeNode(Root->left);
   removeNode(Root->right);
   delete Root;
  }
 }
 TreeNode<T>* getRoot()                                  //得到二叉樹的根節點
 {
  return root;
 }
};

 

//*********************************main.cpp*****************************************

#include "stdafx.h"
#include "iostream"
#include "BinaryTree.h"
using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{
 BinaryTree<char> myTree;
 cout<<"***遞歸先序輸出***"<<endl;
 myTree.preOrderI(myTree.getRoot());
 cout<<endl;
    cout<<"***非遞歸先序輸出***"<<endl;
 myTree.preOrderII();
 cout<<endl;
 cout<<"****廣度優先遍歷****"<<endl;
 myTree.levelOrder();
 cout<<endl;
 cout<<"*****清空*****"<<endl;
 myTree.clearTree(myTree.getRoot());
 myTree.preOrderI(myTree.getRoot());
 cout<<endl;
 cout<<"*****析構*****"<<endl;

 return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章