leetcode每天一题:【二叉树的中序遍历】(简单)

293 阅读3分钟

这是我参与2022首次更文挑战的第26天,活动详情查看:2022首次更文挑战

题目描述

leetcode题目地址

传入一个二叉树的根节点root为参数,然后需要你实现这个二叉树的中序遍历。

画个图举个例子(纯手工制作😂)

image.png

思路分析

二叉树

我们先来学习来二叉树。

一个树是有根节点的,然后通过根节点衍生子节点,子节点又衍生子节点。然后就形成了树。

然后二叉树是一个特别的树,它每个节点至多有2个节点。所以叫做二叉树。

以我上面的图为例子,这个就是一个二叉树。每个节点至多有2个节点。

image.png

二叉树分为三部分:

  • 左边树,也就是D,B,E这几个节点。
  • 根节点,A。
  • 右边树,也就是C,F,I,H,J这几个节点。

中序遍历

二叉树的遍历方法主要有前序遍历,中序遍历,后序遍历三种方法,且经常考察。

这三种方法遍历顺序:

前序遍历就是先从根节点开始遍历,然后到左边树,最后到右边树。

中序遍历就是先从左边树开始遍历,然后到根节点,最后到右边树。

后序遍历就是先从左边树开始遍历,然后到右边树,最后到根节点。

今天主要是讲中序遍历。

第一种方法

主要是通过递归来实现,先判断根节点是否为null, 如果为null直接返回。

然后先遍历左边树,递归调用,这样就遍历左边树所有的节点。

然后接着把根节点的val push到res数组中。

最后遍历右边树,递归调用,这样就能遍历右边树所有的节点。

最后返回res数组即可。

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number[]}
 */
var inorderTraversal = function (root) {
  const res = [];
  function inorder (root) {
    if (root === null) return
    inorder(root.left)
    res.push(root.val)
    inorder(root.right)
  }
  inorder(root)
  return res
};

image.png

第二种方法

这个方法主要是通过while循环来实现的。

流程是把左边树入栈,出栈,根节点入栈,出栈,右边树入栈,出栈。

定义一个res数组(返回结果),和stack数组(节点入栈)。

进行while循环,如果有当前节点或者stack有值就一直循环。

内部再进行while循环,如果有当前节点则把当前节点push到stack中。

然后继续把当前节点的左边树赋值给当前节点,继续遍历。 直接当前节点为null。

然后把stack的数组截取最后一个节点,把它的val push到数组中,然后把它的右边树赋值给当前节点。继续遍历。

最后当stack为空和节点为空的时候代表遍历结束。

返回数组res即可。

代码如下:

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number[]}
 */
var inorderTraversal = function (root) {
  const res = []
  const stack = []
  while (root || stack.length) {
    while (root) {
      stack.push(root)
      root = root.left
    }
    root = stack.pop()
    res.push(root.val)
    root = root.right
  }
  return res
};

image.png