题目链接
目录
一 关于本题的解决
本题要求进行中序遍历,首先知道二叉树的遍历方式
某序遍历,就是中结点在遍历中的位置(左开头)
1.前序遍历: ABC
2.中序遍历: BAC
3.后序遍历: BCA
遍历思路:
使用 栈+标识 的方式,标识为 是否已经处理过, yes ,no(又或者理解为是否已经从他身上拿到了其左右子节点的信息了),
设置栈的元素为 (标识,结点) 形式
每次取出并处理栈顶元素,当栈顶元素的标识是no(未处理)则 以 其右结点,其本身,其左结点 按顺序入栈,(栈是先进后出,目标是左中右,故进栈顺序是右中左)并转标识为 yes
当处理的结点的标识为yes(已处理过)则取出其值放入结果列表中,最后返回结果列表
原理解释:
我们知道,一棵二叉树的中序遍历是从最左边最底下(最左下)的结点开始的
当你取出的结点标识为yes,证明之前他已经取出过子结点信息了,其左子结点在栈中的位置在其之上(离栈顶更近),第二次在取出它,证明已经
他的左子结点已经被取出了,在未放进结果的树结点中,他就是最左下,轮到他进结果啦!
至于到真正的最坐下结点时,它的子结点是None,我们也把它进栈了(标识,None),但是在下一次取出栈顶时通过if+continue语句,跳过了这次空结点的处理
代码展示:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
res=[]
yes, no = 1, 0
# 是否已经访问的标识
stack =[(no, root)]
while stack:
flag, node = stack.pop()
# 每次将栈顶元素直接取出,以读取其左右结点,是否放回要看其标识
if node == None:continue
if flag == no:
stack.append((no, node.right))
stack.append((yes, node))
stack.append((no, node.left))
else:
res.append(node.val)
return res
二 其它遍历的拓展(模板)
更改代码中进栈顺序可以获得其他遍历结果 记得栈是先进后出的,进栈顺序与遍历要求要相反
# 前序遍历 进栈顺序:右左中
if flag == no:
stack.append((no, node.right))
stack.append((no, node.left))
stack.append((yes, node))
else:
res.append(node.val)
# 后序遍历 进栈顺序:中右左
if flag == no:
stack.append((yes, node))
stack.append((no, node.right))
stack.append((no, node.left))
else:
res.append(node.val)
三 其他遍历方法 (借鉴前百分之零点几的大佬)
16ms 最快的,(膜拜)
Definition for a binary tree node.
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Solution:
def inorderTraversal(self, root:TreeNode) -> list[int]:
# 给的结点为空直接返回空列表(按题目要求)
if not root:
return []
res = []
stack =[]
move = root # 指向处理的结点,处理后指向下一个要处理的结点
while move or stack:
# 下一个结点不为空 或者 栈不为空 都是还没遍历完
if move:
# 当前结点不为空,进栈,接下来看其左结点
stack.append(move)
move = move.left
else:
# 每次 为空 都证明栈顶元素已经是最左下 轮到它进结果了 即已经没有左结点
move = stack.pop()
res.append(move.val)
move = move.right
# 但是有可能有右结点,但是在遍历顺序在其后面
return res