二叉树的先序递归以及非递归遍历

//***********************************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;
}

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