这是我参与2022首次更文挑战的第26天,活动详情查看:2022首次更文挑战
题目描述
传入一个二叉树的根节点root为参数,然后需要你实现这个二叉树的中序遍历。
画个图举个例子(纯手工制作😂)
思路分析
二叉树
我们先来学习来二叉树。
一个树是有根节点的,然后通过根节点衍生子节点,子节点又衍生子节点。然后就形成了树。
然后二叉树是一个特别的树,它每个节点至多有2个节点。所以叫做二叉树。
以我上面的图为例子,这个就是一个二叉树。每个节点至多有2个节点。
二叉树分为三部分:
- 左边树,也就是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
};
第二种方法
这个方法主要是通过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
};