【算法】二叉树的前序遍历/中序遍历/后序遍历详解

这个来自leetcode的第144个问题。(中等难度)

问题描述:给定一个二叉树,返回它的 前序 遍历。

相信我们在上学期间(计算机相关专业的)已经学过二叉树,既然决定写这一篇博客,那么就从头开始复习加学习。

二叉树:

      定义:二叉树是n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树组成。或者更通俗点讲: 二叉树(binary tree)是一棵树,其中每个节点都不能有多于2个的儿子节点。

如下图所示(普通的二叉树):

【算法】二叉树的前序遍历/中序遍历/后序遍历详解_第1张图片

从上面的图中,我们可以得到二叉树的基本特点:

       (1)每个结点最多有两颗子树,所以二叉树中不存在度大于2的结点。
       (2)左子树和右子树是有顺序的,次序不能任意颠倒。
       (3)即使树中某结点只有一棵子树,也要区分它是左子树还是右子树。

二叉树的一些性质:

      (1)在二叉树的第i层上最多有2i-1 个节点 。(i>=1)
      (2)二叉树中如果深度为k,那么最多有2k-1个节点。(k>=1)
      (3)n0=n2+1 n0表示度数为0的节点数,n2表示度数为2的节点数。
      (4)在完全二叉树中,具有n个节点的完全二叉树的深度为[log2^n]+1,其中[log2^n]是向下取整。

若对含 n 个结点的完全二叉树从上到下且从左至右进行 1 至 n 的编号,则对完全二叉树中任意一个编号为 i 的结点有如下特性:

(1) 若 i=1,则该结点是二叉树的根,无双亲, 否则,编号为 [i/2] 的结点为其双亲结点;
(2) 若 2i>n,则该结点无左孩子, 否则,编号为 2i 的结点为其左孩子结点;
(3) 若 2i+1>n,则该结点无右孩子结点, 否则,编号为2i+1 的结点为其右孩子结点。

二叉树的分类:斜树、满二叉树、完全二叉树(如果有不太清楚的见这篇博客)。

二叉树的遍历:

       二叉树的遍历是指从二叉树的根结点出发,按照某种次序依次访问二叉树中的所有结点,使得每个结点被访问一次,且仅被访问一次。

       其遍历的次序包括:前序遍历、中序遍历、后序遍历、层序遍历(不太常用)

前序遍历:

       定义:从二叉树的根结点出发,当第一次到达结点时就输出结点数据,按照先向左在向右的方向访问。(口诀:根左右

举个小栗子:(如下图所示写出其前序遍历的顺序)

【算法】二叉树的前序遍历/中序遍历/后序遍历详解_第2张图片

从根结点出发,则第一次到达结点A,即输出A;
继续向左访问,第一次访问结点B,即输出B;
按照同样规则,输出D,输出H;
当到达叶子结点H,返回到D,
此时已经是第二次到达D,故不在输出D,
进而向D右子树访问,D右子树不为空,则访问至I,第一次到达I,则输出I;
I为叶子结点,则返回到D,
D左右子树已经访问完毕,则返回到B,
进而到B右子树,第一次到达E,故输出E;
向E左子树,故输出J;
按照同样的访问规则,继续输出C、F、G;

得到的结果为:ABDHIEJCFG

中序遍历:

       定义:从二叉树的根结点出发,当第二次到达结点时就输出结点数据,按照先向左在向右的方向访问。(口诀:左根右

举个小栗子:(如下图所示写出其中序遍历的顺序)

【算法】二叉树的前序遍历/中序遍历/后序遍历详解_第3张图片

从根结点出发,则第一次到达结点A,不输出A,
继续向左访问,第一次访问结点B,不输出B;
继续到达D,H;
到达H,H左子树为空,则返回到H,
此时第二次访问H,故输出H;
H右子树为空,则返回至D,
此时第二次到达D,故输出D;
由D返回至B,
第二次到达B,故输出B;
按照同样规则继续访问,输出J、E、A、F、C、G;

得到的结果为:HDIBJEAFCG  

后序遍历:

       定义:从二叉树的根结点出发,当第三次到达结点时就输出结点数据,按照先向左在向右的方向访问。(口诀:左右根

举个小栗子:(如下图所示写出其后序遍历的顺序)

【算法】二叉树的前序遍历/中序遍历/后序遍历详解_第4张图片

从根结点出发,则第一次到达结点A,不输出A,
继续向左访问,第一次访问结点B,不输出B;继续到达D,H;
到达H,H左子树为空,则返回到H,
此时第二次访问H,不输出H;
H右子树为空,则返回至H,
此时第三次到达H,故输出H;
由H返回至D,第二次到达D,不输出D;
继续访问至I,I左右子树均为空,
故第三次访问I时,输出I;
返回至D,此时第三次到达D,故输出D;
按照同样规则继续访问,输出J、E、B、F、G、C,A;

得到的结果为:HIDJEBFGCA

层次遍历:

       定义:按照树的层次自上而下的遍历二叉树。如上面的图所示二叉树的层次遍历结果为:ABCDEFGHIJ

       二叉树的遍历有一类典型题型:

  • 已知前序遍历序列和中序遍历序列,确定一棵二叉树。
  • 已知后序遍历序列和中序遍历序列,确定一棵二叉树。

要注意一点:已知前序遍历序列和后序遍历序列,不可以唯一确定一棵二叉树。

      今天大概就介绍那么多,那么让我们回到本博客的重点上来即用代码实现:给定一个二叉树,返回它的 前序 遍历。

      前面提到了知识点中有前序遍历:即“前”指的是先访问根结点,然后依次访问它的左孩子和右孩子,最终遍历整一颗树。那么我们在用代码表示时是不是先检查其根节点,如果其不为空,让其进入容器,然后在递归遍历该根节点 的左孩子节点和右孩子节点。然后返回容器里面的元素。

class Solution {
public:
    vector ans;
    void dfs(TreeNode* root)
    {
        if(root==NULL)
            return;
        ans.push_back(root->val);
        dfs(root->left);
        dfs(root->right);
    }
    vector preorderTraversal(TreeNode* root) {
        dfs(root);
        return ans;
    }
};

             不后悔过去,不幻想未来,把握好现在,就是对自己最好的交代!!!!!!!!!!!!

你可能感兴趣的:(算法,算法,二叉树,前序遍历,中序遍历,后序遍历)