内容由尚学堂java代码模仿而来
#include<iostream>
#include<string>
#include<queue>
using namespace std;
template<typename ElementType>
class Node{
public:
ElementType Data;
Node* Left;
Node* Right;
Node(ElementType,Node*,Node*);
};
template<typename ElementType>
Node<ElementType>::Node(ElementType data,Node* left,Node* right)
:Data(data),Left(left),Right(right){
}
template<typename ElementType>
class Tree{
protected:
Node<ElementType>* Root;
public:
Tree(Node<ElementType>*);
bool isEmpty();
int size();
int getHeight();
Node<ElementType>* findKey(ElementType);
void inOrderTraverse();
void levelOrderByStack();
private:
int size(Node<ElementType>*);
int getHeight(Node<ElementType>*);
Node<ElementType>* findKey(ElementType,Node<ElementType>*);
void inOrderTraverse(Node<ElementType>*);
void levelOrderByStack(Node<ElementType>*);
};
template<typename ElementType>
void Tree<ElementType>::levelOrderByStack(){
if(this->Root==NULL){
cout<<"遍历错误:无数据"<<endl;
return;
}
cout<<"层次遍历:"<<endl;
this->levelOrderByStack(this->Root);
cout<<endl;
}
template<typename ElementType>
void Tree<ElementType>::levelOrderByStack(Node<ElementType>* root){
queue<Node<ElementType>*> Queue;
Queue.push(root);
while(Queue.size()!=0){
for(int i=0;i<Queue.size();i++){
Node<ElementType>* temp=Queue.front();
cout<<temp->Data<<" ";
if(temp->Left!=NULL)
Queue.push(temp->Left);
if(temp->Right!=NULL)
Queue.push(temp->Right);
Queue.pop();
}
}
}
template<typename ElementType>
void Tree<ElementType>::inOrderTraverse(){
if(this->Root==NULL){
cout<<"遍历错误:无数据"<<endl;
return;
}
cout<<"中序遍历:"<<endl;
this->inOrderTraverse(this->Root);
cout<<endl;
}
template<typename ElementType>
void Tree<ElementType>::inOrderTraverse(Node<ElementType>* root){
if(root!=NULL){
this->inOrderTraverse(root->Left);
cout<<root->Data<<" ";
this->inOrderTraverse(root->Right);
}
}
template<typename ElementType>
Node<ElementType>* Tree<ElementType>::findKey(ElementType value){
return findKey(value,this->Root);
}
template<typename ElementType>
Node<ElementType>* Tree<ElementType>::findKey(ElementType value,Node<ElementType>* root){
if(root==NULL)
return NULL;
else if(root!=NULL&&root->Data==value)
return root;
else{
Node<ElementType>* L=this->findKey(value,root->Left);
Node<ElementType>* R=this->findKey(value,root->Right);
if(L!=NULL&&L->Data==value)
return L;
else if(R!=NULL&&R->Data==value)
return R;
else
return NULL;
}
}
template<typename ElementType>
int Tree<ElementType>::getHeight(){
return this->getHeight(this->Root);
}
template<typename ElementType>
int Tree<ElementType>::getHeight(Node<ElementType>* root){
if(root==NULL)
return 0;
int L=this->getHeight(root->Left);
int R=this->getHeight(root->Right);
return L>R? L+1:R+1;
}
template<typename ElementType>
int Tree<ElementType>::size(){
return size(this->Root);
}
template<typename ElementType>
int Tree<ElementType>::size(Node<ElementType>* root){
if(root==NULL)
return 0;
int L=this->size(root->Left);
int R=this->size(root->Right);
return L+R+1;
}
template<typename ElementType>
bool Tree<ElementType>::isEmpty(){
return this->Root==NULL;
}
template<typename ElementType>
Tree<ElementType>::Tree(Node<ElementType>* root):Root(root){
}
int main(){
Node<int>f5(5,NULL,NULL);
Node<int>f4(4,NULL,&f5);
Node<int>f3(3,NULL,NULL);
Node<int>f7(7,NULL,NULL);
Node<int>f6(6,NULL,&f7);
Node<int>f2(2,&f3,&f6);
Node<int>f1(1,&f4,&f2);
Tree<int>btree(&f1);
cout<<btree.isEmpty()<<endl;
//中序遍历递归 4513267
btree.inOrderTraverse();
//按照层次遍历 借助队列
btree.levelOrderByStack();
return 0;
}