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; } //二叉查找樹 左邊子樹都比根節點小 ,右邊都比根節點大 //數組實現二叉樹 容易造成比較多的空間浪費