由于本人基础较差,所以针对部分题型做一个记录,以免自己忘记
这个遍历方法可以搜一下博客上很多讲解,这里主要是记录一下代码实现,以下面的二叉树为例子
这里借用了一个临时的栈(先访问的后处理),存储对应的根节点以及左子树对应的节点,整个过程基本上是不断访问子树(先左,后根,然后右),将根节点推入栈,当访问到最后一个根节点的左子树节点为空时,从栈顶取出对应元素,再访问其右子树节点,判断其是否有左右子树再进行操作。
直到左子树节点为空(即图示所示77对应的节点左子节点为空),取对应栈顶元素
此时说明该节点无左子树,根据中序遍历左跟右的顺序,左子树为空,此时应该读取根节点元素(即取出对应的栈顶元素),这里77即为我们中序遍历的第一个节点
访问77对应右子树节点
为空则说明这个节点对应无右子树,那么也就不用访问其对应右节点
至此,以77为根节点的左子树访问完毕
查询以90为根节点的右子树是否有左子节点
如果以90为根节点的右子树有左子节点,那么方法同上,依次访问下去
如果没有左子节点,那么取出栈中的90这个根节点
查询以90为根节点的子树是否有右子树
此时以90为根节点的子树右子树节点为空,那么接下来进一步访问栈中所存的对应根节点元素
继续读取栈顶元素(此时对应34)
此时,以34为根节点的左子树我们已经处理完毕了,34这个根节点也读取了,那么接下来处理34对应的右子树。
查询以45为根节点的左子树是否有右子节点
若有则推入栈中,查询接下来是否有左子节点
若无则说明以45为根节点的子树访问完毕,接下来继续处理栈顶元素
观察以60为根节点的右子树是否还有左右节点
若有左子节点则继续遍历
若无左子节点则取出栈顶元素(60),开始遍历右子树。
若右子节点不为空,则推入栈中继续遍历
若右子节点为空,且栈为空时,则整个中序遍历结束
代码前面的说明直接拷贝了力扣的内容,函数的主要思想是
从根节点遍历二叉树,如果根节点为空,则直接返回空list
接下来是正常流程(整个流程走完同上面的遍历过程)
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution(object):
def inorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
if not root:
return []
res, stack = list(), list()
curr = root
while curr or len(stack): # 指针为空且栈中元素为空时结束循环
while curr: # 当前指针不为空,推入根节点
stack.append(curr)
curr = curr.left
# 左子节点为空,则读取栈顶元素对应的根节点
node = stack.pop()
res.append(node.val)
# 读取右子树
curr = node.right
return res
这里给的用例是
输入:[1,null,2,3]
输出:[1,3,2]
这里我打印了最初的根节点:
(TreeNode{val: 1, left: None, right: TreeNode{val: 2, left: TreeNode{val: 3, left: None, right: None}, right: None}}, 'root')
/**
* 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) {
if (!root) return []
const stack = [], res = []
let curr = root
let node
while (!(!stack.length && !curr)) { // 指针为空且栈中无元素时,结束循环
// while (stack.length || curr) {
while (curr) { // 指针不为空
stack.push(curr)
curr = curr.left
}
node = stack.pop()
res.push(node.val)
curr = node.right
}
return 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) {
if (!root) return []
const inorder = (node, res) => {
if (!node) return
inorder(node.left, res)
res.push(node.val)
inorder(node.right, res)
}
const res = []
inorder(root, res)
return res
};
力扣讲解