,二叉树是一种非常有用的结构,二叉树是每个节点最多有两个子树的树结构,通常子树被称作“左子树”(左子树)和“右子树”(右子树)。二叉树常被用于实现二叉查找树和二叉堆。
,二叉树的每个结点至多只有二棵子树(不存在度大于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; } 二叉树的递归实现