二叉树的节点定义:
class TreeNode:#相当于链表,只不过多了一个指针
def __init__(self , root):
self.root = val
self.left = None
self.right = None
二叉树的遍历:
1.递归遍历 (前中后序遍历):
写递归时明白以下三个点就容易很多:a.首先确定递归函数的参数和返回值
b.确定终止条件
c.单曾的递归逻辑表达式
代码:
class TreeNode:
def __init__(self,root):
self.root = val
self.left = None
self.right = None
#递归前序遍历
class solution:
def preodertraversal(self,root):
result = []
def traversal(root):
if not root: #如果root为空
return
result.append(root.val) #中
traversal(root.left) #左
traversal(root.left) # 右
traversal(root)
return result
2.非递归前序遍历:
前序遍历的顺序是:中左右 ,每次先处理中间节点,将根节点放入栈中,然后再将右孩子加入栈中,然后就是左孩子(此时栈中【 右 ,左 -->】 按照出栈的顺序,左孩子先出栈)
利用栈来实现
#迭代前序遍历(中左右)
class solution:
def preodertraversal(self,root:TreeNode):
if not root:
return
stack = [root] # 把 root的根节点传入栈
result = [] #保存结果
while stack:
#弹出节点
node = stack.pop()
# 先处理中间节点
result.append(node.val)
“”“
#先要放入右节点
# stack = [right,left)
#先弹出左节点的(前序遍历(中左右))
”“”
if node.right :
stack.append(node.right)
if node.left:
stack.append(node.left)
return result
3.非递归后序遍历:
后序:左右中
按照前序(中左右)的方法进行处理,然后反转: 中右左 ————>左右中
#迭代后序遍历(左右中)
class solution:
def preodertraversal(self,root:TreeNode):
if not root:
return
stack = [root] # 把 root的根节点传入栈
result = [] #保存结果
while stack:
#弹出节点
node = stack.pop()
# 先处理中间节点
result.append(node.val)
if node.left: #先放入左孩子
stack.append(node.left)
if node.right : #然后就是右孩子
stack.append(node.right)
return result[::-1] #进行数组发翻转
4.非递归中序遍历:
中序:左中右
此时的中序不同于之前的前后遍历(先处理中间节点),而中序是先访问二叉树顶部的节点,然后一层一层的往下访问直到树的左面的最底部,再来处理节点,这就使得访问和处理的顺序不一样,我们可以借助指针来访问节点:
#迭代中序遍历(左中右)
class solution:
def preodertraversal(self,root:TreeNode):
if not root:
return
stack = [] #不能把根节点直接放进去
res = []
cur = root #指向根节点
while stack or cur:
if cur:#往树的左子树走,把访问过的加入栈
stack.append(cur) #把当前访问的加入栈中
cur = cur.left
else:#当前节点为空,说明左边走到走了,弹出并保存
cur = stack.pop()
res.append(cur.val)
cur = cur.right#然后继续指向右孩子,重复上面的过程
return res