解题思路:
(一)
二叉树的中序排列为 左根右,先遍历左半部分,然后根结点,再右半部分。
对左半部分又可以按照初始状态进行划分,右半部分也是一样,可以使用递归
先取根节点的左节点递归,如果左节点为空说明到最左边了,这时该节点为这层的根节点,由左根右顺序,把不用递归的根结点添加到栈中,在进行递归该根结点的右子节点,没有的话返回
递归实现时,是函数自己调用自己,一层层的嵌套下去,操作系统/虚拟机自动帮我们用 栈 来保存了每个调用的函数
递归是一个树结构,从字面可以其理解为重复“递推”和“回归”的过程,当“递推”到达底部时就会开始“回归”,其过程相当于树的深度优先遍历。
调用过程:
dfs(root.left)
dfs(root.left)
dfs(root.left)
为null返回
打印节点
dfs(root.right)
dfs(root.left)
dfs(root.left)
........
递归实现
res = [] #存储结点值
def dg(root):
if not root: #如果当前结点为空,返回 ,进行加入结点值
return
dg(root.left) #按照左,加入根,右方式遍历
res.append(root.val)
dg(root.right)
dg(root) #调用自己
return res
(二)
使用迭代:重复反馈过程的活动,每一次迭代的结果会作为下一次迭代的初始值。(A重复调用B)
迭代是一个环结构,从初始状态开始,每次迭代都遍历这个环,并更新状态,多次迭代直到到达结束状态。
解:从根节点出发向左节点,每到一个节点就存储到栈中,最后一个进入的节点是最左结点,然后出栈,保存其元素值,查看其右节点,有的话,入栈,从该节点出发向左节点,若无右节点,继续出栈,循环,直到结点全部入栈并且出栈,结束
if not root:
return []
res = [] #存储结点值
stack = [] #暂时保存结点,相当于栈
cur = root #设置指针
while cur or stack: #当cur指向值和栈为空时说明没有元素了
while cur : #把从根到左一条路依次加入栈
stack.append(cur)
cur = cur.left
node = stack.pop() #到达最后,就把栈中最后一个结点值取出加入结果res中
res.append(node.val)
cur = node.right #在看这个节点的右子节点,循环
return res #当所有结点加入栈中,最后出栈完后,res