二叉树的认识
二叉树是指最多只有两个节点分支的一颗树,习惯性得将一个节点的两个孩子记做左孩子以及右孩子。
上图就是一颗二叉树,一般来说其左右的区分只是相对于其父辈以及祖辈节点而言。一颗二叉树的典型结构体定义如下:
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(nullptr), right(nullptr) {}
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left),right(right) {}
};
通过代码显然可见的是对于一个二叉树的节点,其中有3个基本的元素,分别是:
val
——表示二叉树上当前节点值left,right
——表示当前节点的左右孩子指针3 method
——表示构造这个节点的3中不同的方法,第一种是默认构造一个值为0,左右孩子为空的节点(相当于叶子节点);第二种是传入一个int
参数值,来构造一个值为x
的叶子节点;第三种则是不仅传入节点值,而且可以指定该节点的左右孩子节点。
二叉树的遍历
提到二叉树,就不得会提到如何去遍历一颗二叉树。所谓遍历就是通过一种规则依次输出树中每个节点的值。
最基础的是3种遍历方法就是前,中,后序遍历,这里的前、中、后就时指的是中间节点在遍历时所在的位置,而左孩子节点永远先于右孩子节点。
对于任意一颗二叉树都可以局部分解成这样一种三角结构(如上图中的红框),从根节点出发,第一个三角结构是FBG
这样子,其中F
为中间节点,如果是前序
遍历,则排序为FBG
,中序
遍历为BGF
,后序
遍历为BGF
。
因此,根据上述规则,通过前序遍历完上述整颗二叉树的步骤如下所示:
-->F B G
——然后根据左孩子先于右孩子原则,走向节点B
-->F (B A D) G
——以B
作为中间节点,继续遍历其对应的三角区域-->F (B A D C E) G
——A
为叶子节点,所以跳过,走向D
--> F (B A D C E) (G I)
——整个左边遍历结束,然后处理右边节点,走向G
--> F (B A D C E) (G I H)
——G
无左孩子,跳过,走向I
,I
无右孩子,最后遍历结束
之后的中序遍历以及后序遍历也是类似如此,化成小三角区域可以解决。