目录
一、二叉树介绍
1.定义:二叉树是n个结点的有限集合,该集合或者为空集,或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树构成。
2.形态:二叉树有5种形态,分别是空二叉树、只有一个根结点、根和左孩子、跟和右孩子、根和左右孩子。
3.分类:满二叉树、完全二叉树、不完全二叉树 (满二叉树是特殊的完全二叉树)
如何进行区分?对当前树进行编号从上到下从左到右依次编号,如果编号中间没有断开,而且最底层是全的,就是满二叉树;如果编号中间没有断开,最底层不是满的,是完全二叉树;如果中间编号断开,一定是不完全二叉树。
4.特点:
(1)每个结点最多有两棵子树(不是只有两棵),二叉树中不存在度大于2的结点。
(2)左子树和右子树次序不能颠倒,如同人的左右手。
(3)即使树中某结点只有一棵子树,也要区分它是左子树还是右子树,例如树1树2是同一棵树,但却是不同的二叉树。
二、二叉树遍历
本篇重点介绍先序遍历、中序遍历、后序遍历和层遍历的实现思路及代码。层遍历很好理解,顾名思义就是一层一层进行遍历,先、中、后序是按照根结点与左右孩子的遍历顺序来区别的。
先序遍历顺序就是先遍历根,然后是左孩子,最后遍历右孩子,简称根左右;中序遍历:左跟右;后序遍历:左右根。
1.创建二叉树
在遍历二叉树之前,我们需要先创建一颗二叉树,我们以下图二叉树为例来写代码:
在这棵二叉树中,我们可以发现根结点A的左右孩子又都分别是一棵树,所以在创建和遍历时都可以运用递归来写代码。在创建二叉树的过程中,我们假设“#”作为结束,把上面这棵二叉树补充完整可得下图:
用先序遍历(根左右)的思想来创建这棵树,先遍历A,然后A的左孩子,再遍历A的右孩子,那么先序遍历顺序应该为ABDG##HI####CF##,得到一个字符串,我们创建根结点把A放进去,然后创建左孩子和右孩子。
代码示例:
#include<iostream>
using namespace std;
//一个结点需要三部分组成:自身的值,指向左孩子的指针、指向右孩子的指针
class Node
{
public:
Node():m_left(NULL),m_right(NULL){}
Node(char v) :m_value(v), m_l