数据结构:树

资料摘自<数据结构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;

}

测试输出:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值