赞
踩
1. 二叉树的层序遍历
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
示例:
二叉树:[3,9,20,null,null,15,7]
,
- 3
- / \
- 9 20
- / \
- 15 7
返回其层次遍历结果:
- [
- [3],
- [9,20],
- [15,7]
- ]
方法1: 这种方法 不好
- # Definition for a binary tree node.
- class TreeNode:
- def __init__(self, x):
- self.val = x
- self.left = None
- self.right = None
-
- class Solution:
- def levelOrder(self, root: TreeNode) -> List[List[int]]:
- # 层序遍历 按层访问
- # 队列 FIFO
- queue_node = [root]
- node_list = []
- while queue_node: # 队列非null, 一直循环
- # 处理 根节点
- queue_len = len(queue_node)
- print(queue_len)
- layer_queue = []
- layer_list = []
- for node in queue_node:
- if node:
- layer_list.append(node.val) # 没有按照队列操作,每层输出
- layer_queue.append(node.left)
- layer_queue.append(node.right)
- if layer_list:
- node_list.append(layer_list)
- queue_node = layer_queue
- return node_list
方法2: 使用一个depth标记
- # Definition for a binary tree node.
- class TreeNode:
- def __init__(self, x):
- self.val = x
- self.left = None
- self.right = None
-
- class Solution:
- def levelOrder(self, root: TreeNode) -> List[List[int]]:
- # 层序遍历 按层访问
- # 队列 FIFO
- queue_node = [(root, 0)] # 深度
- cur_depth = 0 # 用来 确定是否换层
- ans = []
- temp = []
- for node, depth in queue_node:
- if node:
- # 判断 深度是否发生变化
- if cur_depth != depth:
- cur_depth = depth
- ans.append(temp)
- temp = []
- temp.append(node.val)
- queue_node.append((node.left, depth+1))
- queue_node.append((node.right, depth+1)) # 子节点 所以深度+1
- if temp:
- ans.append(temp)
- return ans
给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:
给定二叉树 [3,9,20,null,null,15,7],
- 3
- / \
- 9 20
- / \
- 15 7
返回锯齿形层次遍历如下:
- [
- [3],
- [20,9],
- [15,7]
- ]
方法1:
- # Definition for a binary tree node.
- class TreeNode:
- def __init__(self, x):
- self.val = x
- self.left = None
- self.right = None
-
- class Solution:
- def zigzagLevelOrder(self, root: TreeNode) -> List[List[int]]:
- queue_node = [root]
- node_list = []
- flag = False # 为True 将每层node值结果倒序
- # 思路:保持层序遍历不变, 只在 需要从右到左时: 每层节点node值 倒序一下即可
- while queue_node:
- layer_list = []
- layer_node = []
- for node in queue_node:
- if node:
- layer_list.append(node.val)
- layer_node.append(node.left)
- layer_node.append(node.right)
- if flag:
- layer_list.reverse()
- flag = not flag
- if layer_list:
- node_list.append(layer_list)
- queue_node = layer_node
- return node_list
3. 94. 二叉树的中序遍历
给定一个二叉树,返回它的中序 遍历。
示例:
- 输入: [1,null,2,3]
- 1
- \
- 2
- /
- 3
-
- 输出: [1,3,2]
方法1: 递归
- # Definition for a binary tree node.
- class TreeNode:
- def __init__(self, x):
- self.val = x
- self.left = None
- self.right = None
-
- class Solution:
- def inorderTraversal(self, root: TreeNode) -> List[int]:
- # 1.递归 中序遍历
- if root:
- left = self.inorderTraversal(root.left)
- middle = left + [root.val]
- right = self.inorderTraversal(root.right)
- return middle + right
- return []
方法2: 迭代
- class TreeNode:
- def __init__(self, x):
- self.val = x
- self.left = None
- self.right = None
-
- class Solution:
- def inorderTraversal(self, root: TreeNode) -> List[int]:
- # 2.迭代算法
- value_list = []
- p = root # p 当作移动指针
- stack = [] #栈:先进后出, # 队列:先进先出;
- while p or stack:
- while p: # 找左子树 一直找下去
- stack.append(p)
- p = p.left # p 移动 到 左孩子,直到为null
- # p 为null,从stack中pop
- p = stack.pop()
- value_list.append(p.val)
- # 处理右自子树
- p = p.right
- return value_list
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true
,否则返回 false
。假设输入的数组的任意两个数字都互不相同。
参考以下这颗二叉搜索树:
- 5
- / \
- 2 6
- / \
- 1 3
示例 1:
- 输入: [1,6,3,2,5]
- 输出: false
示例 2:
- 输入: [1,3,2,6,5]
- 输出: true
解法1:
- class Solution:
- def verifyPostorder(self, postorder: List[int]) -> bool:
- '''
- 二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树:
- 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
- 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
- 它的左、右子树 也分别为二叉排序树。
- '''
- '方法1: 递归'
- if len(postorder) <= 2:
- return True
-
- '后序遍历结果规律: 最后一个为根结点, 从左到右遍历,找到第一个大于 根结点的值(索引:k) '
- '左子树在:[0, k-1], 右子树在: [k, right-1], 即可递归'
- '判断条件:若满足左子树值都小于根结点, 右子树值都大于根节点, 为True'
- def verify(tree_list, left, right):
- # 递归必须 本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/943363推荐阅读
相关标签
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。