「Day4」搞定递归二叉树 「hot 100之leetcode94」

69 阅读3分钟

一、题目

94. 二叉树的中序遍历

给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。

示例 1:

image.png

输入: root = [1,null,2,3]
输出: [1,3,2]

更多细节请参看官方题目详情

二、题解

2.1 遍历方法理解

2.1.1 中序遍历

中序遍历是二叉树遍历的一种方式,具体是先遍历左子树,然后遍历根节点,最后遍历右子树。记忆:左值右。

针对给定的二叉树root=[1,null,2,3],它的结构可以表示为:

    1
     \
      2
     /
    3

按照中序遍历的方式,先遍历左子树,但是该树的左子树为空,所以不需要遍历,然后遍历根节点1,最后遍历右子树,按照左->根->右的顺序遍历,所以先遍历3,再遍历2,得到的结果是 [1,3,2]。

2.1.2 先序遍历

先序遍历和后序遍历也是二叉树的两种常用遍历方式。

先序遍历是指先遍历根节点,然后依次遍历左子树和右子树。具体的遍历顺序为:根节点,左子树,右子树。比如对于二叉树 [1,2,3,null,4,5,6,null,null,7,8],我们可以根据以下规则构建这个二叉树:

  • 根节点为1;
  • 节点1的左子节点为2,右子节点为3;
  • 节点2的左子节点为null,右子节点为4;
  • 节点3的左子节点为5,右子节点为6;
  • 节点4的左子节点为null,右子节点为null;
  • 节点5的左子节点为7,右子节点为8;
  • 节点6的左子节点为null,右子节点为null;
  • 节点7的左子节点为null,右子节点为null;
  • 节点8的左子节点为null,右子节点为null。 根据以上规则,我们可以画出这棵二叉树的结构:

image.png

它的中序遍历结果为 [2,4,1,7,5,8,3,6]

它的先序遍历结果为 [1,2,4,3,5,7,8,6]。

2.1.3 后序遍历

后序遍历是指先遍历左子树和右子树,最后遍历根节点。具体的遍历顺序为:左子树,右子树,根节点。对于同一个二叉树,后序遍历的结果为 [4,2,7,8,5,6,3,1]。

2.2 代码

2.2.1 递归法

递归法,最重要的就是明确递归的终止条件

/**
 * Definition for a binary tree node.
 * 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) {}
 * };
 */
class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> result;
        visitValue(root,result);
        return result;
    }
    void visitValue(TreeNode* node, vector<int>& result)
    {
        if(node == nullptr) return;

        visitValue(node->left, result); 
        result.push_back(node->val);
        visitValue(node->right, result);
    }
};

image.png

2.2.2 迭代法

可以看出递归法的效率很高,但是内存耗费很大;官方还提出了 进阶思路 “进阶:  递归算法很简单,你可以通过迭代算法完成吗?” 大家可以自己尝试一下~

三、总结

题目知识点进度
136数组、位运算(异或)、哈希表1
121数组、动态规划2
3字符串、滑动窗口、哈希表3
94二叉树、递归4