资料摘自<数据结构C++语言描述>
树
树结构的特点是它是由唯一的起点“根”开始的“节点”集合。图11.4中,结点A是根根。如果用家族树的概念,一个结点可被看作“双亲”,它指向0个、1个或更多的子节点。
从根到节点之间的路径可以提供一种被称作节点的“层次”这样的度量。节点的层次等于从根到节点之间路径的长度。根的层次为0,根的每个子节点的层次为1,下一层节点的层次为2,以此类推。如下图所示:
二叉树:一种特定的树,这类树中,每个双亲的子节点数不超过两个。如下图所示:
在二叉树中,每个节点有0个、1个或2个子 节点。我们将左边的节点称作“左节点”,右边的节点称作“右节点”。
二叉树是满足下列条件的节点B的集合:
1. 如果节点集为空,B是一棵树(空树亦是树)
2. B可划分为3个独立的子集: 根节点、左子树、右子树
遍历二叉树的方法:
1. 前序遍历:先访问节点,然后遍历左子树,再遍历右子树
2. 中序遍历:先遍历左子树,然后访问节点,再遍历右子树
3. 后序遍历:先遍历左子树,然后遍历右子树,再访问节点
下面给出图Tree_2的三种遍历次序:
前序遍历:ABDGCEHIF
中序遍历:DGBAHEICF
后序遍历:GDBHIEFCA
下面设计上面所示的Tree_2二叉树并进行打印
二叉树节点定义:
template<classT>
classTreeNode
{
private:
TreeNode<T> * left;
TreeNode<T> * right;
public:
T data;
TreeNode(constT& item, TreeNode<T> * lptr= NULL, TreeNode<T> * rptr= NULL);
TreeNode<T> * Left() const;
TreeNode<T> * Right() const;
};
template<classT>
TreeNode<T>::TreeNode(constT& item, TreeNode<T> *lptr, TreeNode<T> * rptr) : data(item), left(lptr), right(rptr) {}
template<classT>
TreeNode<T> * TreeNode<T>::Left()const{
returnthis->left;
}
template<classT>
TreeNode<T> * TreeNode<T>::Right()const{
returnthis->right;
}
template<classT>
TreeNode<T> *GetTreeNode(Titem, TreeNode<T> *lptr = NULL, TreeNode<T> *rptr = NULL){
TreeNode<T> * p;
p = newTreeNode<T>(item,lptr,rptr);
if(p == NULL){
cerr<<"memory allocationfailure ! "<<endl;
exit(1);
}
return p;
}
//前序遍历
//1.访问节点
//2.遍历左子树
//3.遍历右子树
template<classT>
void Preorder(TreeNode<T> * t, voidvisit(T &item)){
if(t != NULL){
visit(t->data);
Preorder(t->Left(),visit);
Preorder(t->Right(),visit);
}
}
//中序遍历
//1.遍历左子树
//2.访问节点
//3.遍历右子树
template<classT>
void Inorder(TreeNode<T> * t, voidvisit(T &item)){
if(t != NULL){
Inorder(t->Left(),visit);
visit(t->data);
Inorder(t->Right(),visit);
}
}
//后序遍历
//1.遍历左子树
//2.遍历右子树
//3.访问节点
template<classT>
void Postorder(TreeNode<T> * t, voidvisit(T &item)){
if(t != NULL){
Postorder(t->Left(),visit);
Postorder(t->Right(),visit);
visit(t->data);
}
}
打印二叉树
usingnamespace std;
void PrintChar(char & elem){
cout<<elem<<"";
}
int_tmain(intargc, _TCHAR* argv[])
{
//构建上面的Tree_2
TreeNode<char> * nodeNULL = NULL;
TreeNode<char> * nodeG = GetTreeNode('G');
TreeNode<char> * nodeD = GetTreeNode('D',nodeNULL,nodeG);
TreeNode<char> * nodeB = GetTreeNode('B',nodeD);
TreeNode<char> * nodeH = GetTreeNode('H');
TreeNode<char> * nodeI = GetTreeNode('I');
TreeNode<char> * nodeE = GetTreeNode('E',nodeH,nodeI);
TreeNode<char> * nodeF = GetTreeNode('F');
TreeNode<char> * nodeC = GetTreeNode('C',nodeE,nodeF);
TreeNode<char> * nodeA = GetTreeNode('A',nodeB,nodeC);
cout<<endl<<"前序遍历: ";
Preorder(nodeA,PrintChar);
cout<<endl<<"中序遍历: ";
Inorder(nodeA,PrintChar);
cout<<endl<<"后序遍历: ";
Postorder(nodeA,PrintChar);
int d;
std::cin>>d;
return 0;
}
测试输出: