二叉树的递归实现

  

,二叉树是一种非常有用的结构,二叉树是每个节点最多有两个子树的树结构,通常子树被称作“左子树”(左子树)和“右子树”(右子树)。二叉树常被用于实现二叉查找树和二叉堆。

,二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。二叉树的第我层至多有2 ^{张}个结点;深度为k的二叉树至多有2 ^ k - 1个结点;对任何一棵二叉树,如果其终端结点数为n_0,度为2的结点数为甲烷,则n_0=甲烷+ 1 .

,一棵深度为k,且有2 ^ k - 1个节点称之为满二叉树;深度为k,有n个节点的二叉树,当且仅当其每一个节点都与深度为k的满二叉树中,序号为1至n的节点对应时,称之为完全二叉树。详细定义见百度百科

,

二叉树的递归实现


void  PrevOrder()//前序遍历   {   _PrevOrder (_root);   }   void  _PrevOrder (BinaryTreeNode *,根)   {   if  (root ==, NULL)   {   返回;   }   cout  & lt; & lt;,根→_data  & lt; & lt; ", ";//先输出根节点   _PrevOrder(根→_left);//在输出左子树   _PrevOrder(根→_right);//最后右子树   }

(二)中序遍历

,,遍历的顺序:D、B, E、A、F、C、G

void  MidOrder()//中序遍历   {   _MidOrder (_root);   }   void  _MidOrder (BinaryTreeNode *,根)   {   if  (root ==, NULL)   {   返回;   }   _MidOrder(根→_left);   cout  & lt; & lt;,根→_data  & lt; & lt;,“,”;   _MidOrder(根→_right);   }

void  RearOrder()//后序遍历   {   _RearOrder (_root);   }   void  _RearOrder (BinaryTreeNode *,根)   {   if  (root ==, NULL)   {   返回;   }   _RearOrder(根→_left);   _RearOrder(根→_right);   cout  & lt; & lt;,根→_data  & lt; & lt;,“,”;   }

(四)层序遍历

,,遍历顺序:A, B, C, D, E, F, G

,,

void  SequenceOrder()//层序遍历   {   queue *祝辞,问;   if  (_root)   q.push (_root);   while  (! q.empty ())   {   if  (q.front ()→_left)   {   q.push (q.front ()→_left);   }   if  (q.front ()→_right)   {   q.push (q.front ()→_right);   }   cout  & lt; & lt;, q.front ()→_data<& lt;,“,”;   q.pop ();   }   }

树的遍历是比较简单的,下面我们看一下有点难度的:

(一)求树的叶子节点的个数:

,数的叶子节点总是在最深的一层,每次当一个子问题的根节点的左右子树都为空时,我们就将戒子节点的个数加一,

,,,,,,,,size_t  LeafCount ()   {   return  _LeafCount (_root);   }   size_t  _LeafCount (BinaryTreeNode *,根)   {   if  (root ==, NULL)   {   return  0;   }   if (根→_left==NULL ,,,根→_right ==NULL)   {   return  1;   }      return  (_LeafCount(根→_left) + _LeafCount(根→_right));   }   

(二)求树的深度

,求树的深度是一个比较有难度的问题,因为我们要比较不同子树的深度的大小,然后取最大的哪一个,但是在一个递归程序中很难保证一个变量不会改变。在这里我们只要比较每个子问题中的左右字数的深度,每次返回使深度最大值加一,最后的值就是树的深度。

size_t  Deepth ()   {   return  _Deepth (_root);   }   size_t  _Deepth (BinaryTreeNode *,根)   {   if  (root ==, NULL)   {   return  0;   }   size_t  leftDeep =, _Deepth(根→_left) + 1;   size_t  rightDeep =, _Deepth(根→_right) + 1;   return  leftDeep 祝辞,rightDeep  ?, leftDeep:, rightDeep;   }

(三)求树的节点的个数

,,这个问题是比较容易的,我们可以用任意一种遍历方式遍历这棵树,每遍历到一个节,点个数就加以。

size_t 尺寸()   {   return  _Size (_root);   }   size_t  _Size (BinaryTreeNode *,根)   {   if  (root ==, NULL)   {   return  0;   }   return  _Size(根→_left), +, _Size(根→_right), +, 1;   }

二叉树的递归实现