#include <iostream>
#include <stack>
#include <queue>
using namespace std;
template<class T>
class TreeNode//节点类
{
public:
T val;
TreeNode<T>* lc;
TreeNode<T>* rc;
public:
TreeNode(T _val=0,TreeNode<T> *_lc=NULL,TreeNode<T>* _rc=NULL):val(_val), lc(_lc),rc(_rc)
{
}
~TreeNode()
{}
TreeNode<T>*Getlc()const{
return lc;
}
// void CreateNode(TreeNode)
void Setlc(TreeNode<T>* _lc);
TreeNode<T>* Getrc() const;
void Setrc(TreeNode<T>* _rc);
void SetVal(T _val);
T GetVal() const
{
return val;
}
bool IsLeaf();
};
template<class T>
void TreeNode<T>::SetVal(T _val)
{
val=_val;
}
template<class T>
void TreeNode<T>::Setlc(TreeNode<T>* _lc)
{
lc=_lc;
}
template<class T>
void TreeNode<T>::Setrc(TreeNode<T>* _rc)
{
rc=_rc;
}
template<class T>
TreeNode<T>* TreeNode<T>::Getrc() const
{
return rc;
}
template<class T>
struct NodeBtr
{
T val;
NodeBtr<T> * lc;
NodeBtr<T>* rc;
};
template<class T>
class Tree
{
private:
TreeNode<T>* subroot;
public:
Tree(TreeNode<T> *_subroot):subroot(_subroot)
{}
Tree()
{
subroot=new TreeNode<T>();
}
~Tree()
{}
TreeNode<T>* CreateTreeNode();
void CreatTree();
bool IsEmptyTree()const;
void DepthTraveral_Recursion() const;
void DepthTraveral_RecursionbyNode(TreeNode<T> *Node) const;
void SetRoot(TreeNode<T>*a)
{
subroot=a;
}
void DepthTraveral_Non_Recursion() const;//深层遍历非递归
void BreadthTraversal_Recursion() const;//广度优先遍历递归
void BreadthTraversal_Non_Recursion() const;//广度优先遍历非递归
};
template <class T>
void Tree<T>::BreadthTraversal_Recursion() const
{
if(NULL==subroot)
{
return ;
}
queue<TreeNode<T>*> Travel;
Travel.push(subroot);
while(!Travel.empty())
{
TreeNode<T>* Travel_top=Travel.front();
cout<<Travel_top->val<<" ";
Travel.pop();
if(NULL!=Travel_top->lc)
{
Travel.push(Travel_top->lc);
}
if(NULL!=Travel_top->rc)
{
Travel.push(Travel_top->rc);
}
}
}
template<class T>
void Tree<T>::BreadthTraversal_Non_Recursion() const
{
}
template <class T>
void Tree<T>::DepthTraveral_Non_Recursion() const
{
if(subroot==NULL)
{
return;
}
stack<TreeNode<T>*> Travel;
Travel.push(subroot);
while(!Travel.empty())
{
TreeNode<T>*Travel_top=Travel.top();//返回的是栈顶的元素
cout<<Travel_top->val<<" ";
Travel.pop();
if(NULL!=Travel_top->rc)
{
Travel.push(Travel_top->rc);
}
if(NULL!=Travel_top->lc)
{
Travel.push(Travel_top->lc);
}
}
}
template<class T>
TreeNode<T>* Tree<T>::CreateTreeNode()
{
T n;
cout<<"输入当前节点的值:";
cin>>n;
if(n<0)
{
return NULL;
}
TreeNode<T> *p=new TreeNode<T>(n);
p->lc=CreateTreeNode();
p->rc=CreateTreeNode();
return p;
}
template<class T>
void Tree<T>::CreatTree()
{
CreateTreeNode();
}
template<class T>
void Tree<T>::DepthTraveral_Recursion() const
{
DepthTraveral_RecursionbyNode(subroot);
}
template<class T>
void Tree<T>::DepthTraveral_RecursionbyNode(TreeNode<T> *Node) const
{
if(NULL==Node)
{
//cout<<"当前树为空"<<endl;
return ;
}
cout<<Node->GetVal()<<" ";
DepthTraveral_RecursionbyNode(Node->lc);
DepthTraveral_RecursionbyNode(Node->rc);
}
int main(int argc,char **argv)
{
Tree<int>* root=new Tree<int>();
root->SetRoot(root->CreateTreeNode());
root->DepthTraveral_Recursion();
#include <stack>
#include <queue>
using namespace std;
template<class T>
class TreeNode//节点类
{
public:
T val;
TreeNode<T>* lc;
TreeNode<T>* rc;
public:
TreeNode(T _val=0,TreeNode<T> *_lc=NULL,TreeNode<T>* _rc=NULL):val(_val), lc(_lc),rc(_rc)
{
}
~TreeNode()
{}
TreeNode<T>*Getlc()const{
return lc;
}
// void CreateNode(TreeNode)
void Setlc(TreeNode<T>* _lc);
TreeNode<T>* Getrc() const;
void Setrc(TreeNode<T>* _rc);
void SetVal(T _val);
T GetVal() const
{
return val;
}
bool IsLeaf();
};
template<class T>
void TreeNode<T>::SetVal(T _val)
{
val=_val;
}
template<class T>
void TreeNode<T>::Setlc(TreeNode<T>* _lc)
{
lc=_lc;
}
template<class T>
void TreeNode<T>::Setrc(TreeNode<T>* _rc)
{
rc=_rc;
}
template<class T>
TreeNode<T>* TreeNode<T>::Getrc() const
{
return rc;
}
template<class T>
struct NodeBtr
{
T val;
NodeBtr<T> * lc;
NodeBtr<T>* rc;
};
template<class T>
class Tree
{
private:
TreeNode<T>* subroot;
public:
Tree(TreeNode<T> *_subroot):subroot(_subroot)
{}
Tree()
{
subroot=new TreeNode<T>();
}
~Tree()
{}
TreeNode<T>* CreateTreeNode();
void CreatTree();
bool IsEmptyTree()const;
void DepthTraveral_Recursion() const;
void DepthTraveral_RecursionbyNode(TreeNode<T> *Node) const;
void SetRoot(TreeNode<T>*a)
{
subroot=a;
}
void DepthTraveral_Non_Recursion() const;//深层遍历非递归
void BreadthTraversal_Recursion() const;//广度优先遍历递归
void BreadthTraversal_Non_Recursion() const;//广度优先遍历非递归
};
template <class T>
void Tree<T>::BreadthTraversal_Recursion() const
{
if(NULL==subroot)
{
return ;
}
queue<TreeNode<T>*> Travel;
Travel.push(subroot);
while(!Travel.empty())
{
TreeNode<T>* Travel_top=Travel.front();
cout<<Travel_top->val<<" ";
Travel.pop();
if(NULL!=Travel_top->lc)
{
Travel.push(Travel_top->lc);
}
if(NULL!=Travel_top->rc)
{
Travel.push(Travel_top->rc);
}
}
}
template<class T>
void Tree<T>::BreadthTraversal_Non_Recursion() const
{
}
template <class T>
void Tree<T>::DepthTraveral_Non_Recursion() const
{
if(subroot==NULL)
{
return;
}
stack<TreeNode<T>*> Travel;
Travel.push(subroot);
while(!Travel.empty())
{
TreeNode<T>*Travel_top=Travel.top();//返回的是栈顶的元素
cout<<Travel_top->val<<" ";
Travel.pop();
if(NULL!=Travel_top->rc)
{
Travel.push(Travel_top->rc);
}
if(NULL!=Travel_top->lc)
{
Travel.push(Travel_top->lc);
}
}
}
template<class T>
TreeNode<T>* Tree<T>::CreateTreeNode()
{
T n;
cout<<"输入当前节点的值:";
cin>>n;
if(n<0)
{
return NULL;
}
TreeNode<T> *p=new TreeNode<T>(n);
p->lc=CreateTreeNode();
p->rc=CreateTreeNode();
return p;
}
template<class T>
void Tree<T>::CreatTree()
{
CreateTreeNode();
}
template<class T>
void Tree<T>::DepthTraveral_Recursion() const
{
DepthTraveral_RecursionbyNode(subroot);
}
template<class T>
void Tree<T>::DepthTraveral_RecursionbyNode(TreeNode<T> *Node) const
{
if(NULL==Node)
{
//cout<<"当前树为空"<<endl;
return ;
}
cout<<Node->GetVal()<<" ";
DepthTraveral_RecursionbyNode(Node->lc);
DepthTraveral_RecursionbyNode(Node->rc);
}
int main(int argc,char **argv)
{
Tree<int>* root=new Tree<int>();
root->SetRoot(root->CreateTreeNode());
root->DepthTraveral_Recursion();
return 0;
}