二叉树遍历(递归实现)
二叉树结点:
template<class T>
struct TreeNode
{
T data;
TreeNode<T>* leftchild;
TreeNode<T>* rightchild;
TreeNode()
{
leftchild = NULL;
rightchild = NULL;
}
TreeNode(T x)
{
data = x;
leftchild = NULL;
rightchild = NULL;
}
};
创建二叉树:
template<class T>
void Tree<T>::CreateTree(TreeNode<T>*& t)
{
T x;
cin >> x;
if (x == '#')
{
t = NULL;
return;
}
t = new TreeNode<T>(x);
if (t == NULL)
return;
CreateTree(t->leftchild);
CreateTree(t->rightchild);
}
先序遍历:
template<class T>
void Tree<T>::PreTra(TreeNode<T>* t)
{
if (t != NULL)
{
cout << t->data << ' ';
PreTra(t->leftchild);
PreTra(t->rightchild);
}
}
中序遍历:
template<class T>
void Tree<T>::InodTra(TreeNode<T>* t)
{
if (t != NULL)
{
InodTra(t->leftchild);
cout << t->data << ' ';
InodTra(t->rightchild);
}
}
后序遍历:
template<class T>
void Tree<T>::PosodTra(TreeNode<T>* t)
{
if (t != NULL)
{
PosodTra(t->leftchild);
PosodTra(t->rightchild);
cout << t->data << ' ';
}
}
销毁二叉树:
template<class T>
void Tree<T>::deleTree(TreeNode<T>* t)
{
if (t == NULL)
return;
deleTree(t->leftchild);
deleTree(t->rightchild);
delete t;
}
完整代码:
#include<iostream>
using namespace std;
template<class T>
struct TreeNode
{
T data;
TreeNode<T>* leftchild;
TreeNode<T>* rightchild;
TreeNode()
{
leftchild = NULL;
rightchild = NULL;
}
TreeNode(T x)
{
data = x;
leftchild = NULL;
rightchild = NULL;
}
};
template<class T>
class Tree
{
public:
TreeNode<T>* root;
Tree();
~Tree();
void CreateTree(TreeNode<T>*& t);
void PreTra(TreeNode<T>* t);
void InodTra(TreeNode<T>* t);
void PosodTra(TreeNode<T>* t);
void deleTree(TreeNode<T>* t);
};
template<class T>
Tree<T>::Tree()
{
root = NULL;
}
template<class T>
Tree<T>::~Tree()
{
}
template<class T>
void Tree<T>::CreateTree(TreeNode<T>*& t)
{
T x;
cin >> x;
if (x == '#')
{
t = NULL;
return;
}
t = new TreeNode<T>(x);
if (t == NULL)
return;
CreateTree(t->leftchild);
CreateTree(t->rightchild);
}
template<class T>
void Tree<T>::PreTra(TreeNode<T>* t)
{
if (t != NULL)
{
cout << t->data << ' ';
PreTra(t->leftchild);
PreTra(t->rightchild);
}
}
template<class T>
void Tree<T>::InodTra(TreeNode<T>* t)
{
if (t != NULL)
{
InodTra(t->leftchild);
cout << t->data << ' ';
InodTra(t->rightchild);
}
}
template<class T>
void Tree<T>::PosodTra(TreeNode<T>* t)
{
if (t != NULL)
{
PosodTra(t->leftchild);
PosodTra(t->rightchild);
cout << t->data << ' ';
}
}
template<class T>
void Tree<T>::deleTree(TreeNode<T>* t)
{
if (t == NULL)
return;
deleTree(t->leftchild);
deleTree(t->rightchild);
delete t;
}
int main()
{
Tree<char> temp;
temp.CreateTree(temp.root);
temp.PreTra(temp.root);
cout << endl;
temp.InodTra(temp.root);
cout << endl;
temp.PosodTra(temp.root);
cout << endl;
temp.deleTree(temp.root);
return 0;
}