2026/1/13 15:54:00
网站建设
项目流程
网站开发需求文件,如何提升seo,政务类网站,企业的网站建设与设计论文第六章 二叉树part01 理论基础 二叉树#xff1a;首先是三种遍历方法 递归遍历 #xff08;必须掌握#xff09; 递归算法的重点内容 1、确定递归函数的参数和返回值#xff1a;确定哪些参数是递归的过程中需要处理的#xff0c;那么就在递归函数里加上这个参数#xff…第六章二叉树part01理论基础二叉树首先是三种遍历方法递归遍历 必须掌握递归算法的重点内容1、确定递归函数的参数和返回值确定哪些参数是递归的过程中需要处理的那么就在递归函数里加上这个参数 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。2、确定终止条件写完了递归算法, 运行的时候经常会遇到栈溢出的错误就是没写终止条件或者终止条件写的不对操作系统也是用一个栈的结构来保存每一层递归的信息如果递归没有终止操作系统的内存栈必然就会溢出。3、确定单层递归的逻辑确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。前序遍历也即沿着左侧一路向下直到遇到空节点再回到上一个节点之后遍历右节点完成后再返回上一节点如此往复# Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solution: def preorderTraversal(self, root: Optional[TreeNode]) - List[int]: vec [] def preorder(cur): if cur is None: return vec.append(cur.val) preorder(cur.left) preorder(cur.right) preorder(root) return vec# Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solution: def postorderTraversal(self, root: Optional[TreeNode]) - List[int]: vec [] def bfs(cur): if cur is None: return bfs(cur.left) bfs(cur.right) vec.append(cur.val) bfs(root) return vec# Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solution: def inorderTraversal(self, root: Optional[TreeNode]) - List[int]: vec [] def bfs(cur): if cur is None: return bfs(cur.left) vec.append(cur.val) bfs(cur.right) bfs(root) return vec一次三道题享受迭代遍历 基础不好的录友迭代法可以放过迭代遍历的思路是使用一个栈来存放要处理的节点。首先判断根结点是否为空如果为空则返回空列表。之后把根节点入栈当栈中还有需要处理的元素时首先处理栈顶的元素把元素值保存到列表里。然后查看其右节点如果有则入栈再查看其左节点如果有则入栈。这里需要注意前序遍历是中左右这里栈是处理后进先出所以入栈的顺序应该是右左class Solution: def preorderTraversal(self, root: Optional[TreeNode]) - List[int]: if root is None: return [] vec [] stack [root] while stack: node stack.pop() vec.append(node.val) if node.right: stack.append(node.right) if node.left: stack.append(node.left) return vec前序遍历是中左右而将前序遍历左右调换顺序就变成中右左再对最终的数组反转就变成左右中也即后序遍历。class Solution: def postorderTraversal(self, root: Optional[TreeNode]) - List[int]: if root is None: return [] vec [] stack [root] while stack: node stack.pop() vec.append(node.val) if node.left: stack.append(node.left) if node.right: stack.append(node.right) return vec[::-1]中序遍历思路不完全一致其逻辑是左中右因此我们需要遍历到左侧末端再向上查找。因此判断结束的条件需要修改只有当前节点和栈中都空才结束当前节点存在时首先入栈再找左侧节点直到当前节点不存在时cur指到空的时候就从栈里面去元素直到栈里也没有元素此时就停在右侧节点的尾部处理栈里的节点并存入到列表中再寻找右侧节点# Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solution: def inorderTraversal(self, root: Optional[TreeNode]) - List[int]: if not root: return [] vec [] stack [] cur root while cur or stack: if cur: stack.append(cur) cur cur.left else: cur stack.pop() vec.append(cur.val) cur cur.right return vec统一迭代 基础不好的录友迭代法可以放过这个部分暂时放过层序遍历代办已经很多了 102.二叉树的层序遍历(opens new window)层序遍历要从每一层里获取节点值本题使用队列手机节点数值定义一个result列表用来储存每一层的内容。首先判定根节点是否存在。存在后将根节点入队。判定的条件是队列非空因为在每一层中需要保存当层的节点因此需要定义一个size来保存队列长度定义level逐层保存节点的数组。用size的长度进行循环因为只接受size个节点。对每一层的节点先取出对头收集对头的节点。查找对头节点的左节点和右节点保存到队列中完成一层的遍历后把该层的节点保存到level数组中由result进行扩展。# Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solution: def levelOrder(self, root: Optional[TreeNode]) - List[List[int]]: queue [] result [] if root is None: return [] queue.append(root) while queue: size len(queue) level [] for i in range(size): node queue.pop(0) level.append(node.val) if node.left: queue.append(node.left) if node.right: queue.append(node.right) result.append(level) return result后续还有一些题目等待处理 - 很疲惫了107.二叉树的层次遍历II(opens new window)199.二叉树的右视图(opens new window)637.二叉树的层平均值(opens new window)429.N叉树的层序遍历(opens new window)515.在每个树行中找最大值(opens new window)116.填充每个节点的下一个右侧节点指针(opens new window)117.填充每个节点的下一个右侧节点指针II(opens new window)104.二叉树的最大深度(opens new window)111.二叉树的最小深度