首页 > 编程语言 >代码随想录算法训练营第十五天|102. 二叉树的层序遍历、226. 翻转二叉树、101. 对称二叉树

代码随想录算法训练营第十五天|102. 二叉树的层序遍历、226. 翻转二叉树、101. 对称二叉树

时间:2023-05-25 19:56:59浏览次数:65  
标签:node right root self 随想录 遍历 二叉树 第十五天 left

【参考链接】

102. 二叉树的层序遍历

 【注意】

1.队列先进先出,符合一层一层遍历的逻辑,而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。而这种层序遍历方式就是图论中的广度优先遍历,只不过我们应用在二叉树上。

2.遍历的时候要记录队列的大小。就可以知道哪些元素是第几层的。

3.记得首先要判断root不为空。  

4.当队列不为空,就一直去遍历。

【代码】

 1 # Definition for a binary tree node.
 2 # class TreeNode(object):
 3 #     def __init__(self, val=0, left=None, right=None):
 4 #         self.val = val
 5 #         self.left = left
 6 #         self.right = right
 7 class Solution(object):
 8     def levelOrder(self, root):
 9         """
10         :type root: TreeNode
11         :rtype: List[List[int]]
12         """
13         #方法1.利用长度法
14         #root若为空,直接返回空列表
15         if not root:
16             return []
17         queue = collections.deque([root]) #队列存储遍历的每一层
18         result = [] #返回一个二维数组
19         while queue:
20             #队列不为空,就一直遍历下去
21             level = []
22             for _ in range(len(queue)):#当前队列长度,记录每一层所含节点个数
23                 cur = queue.popleft()
24                 level.append(cur.val)
25                 if cur.left:
26                     queue.append(cur.left)
27                 if cur.right:
28                     queue.append(cur.right)
29             result.append(level) #将遍历完的每一层结果追加到result中
30         return result
31 
32         #方法2.递归法
33 
34         levels = []
35         self.helper(root,0,levels)
36         return levels
37         
38     def helper(self, node, level, levels):
39         if not node:
40              return
41         if len(levels) == level:
42             levels.append([])
43         levels[level].append(node.val)
44         self.helper(node.left, level + 1, levels)
45         self.helper(node.right, level + 1, levels)

ps:递归法没有理解透,二刷的时候记得看。

226. 翻转二叉树

【注意】

1.两两交换的是指针。

2.利用前序和后序。

3.也可以使用层序遍历。

【代码】

 1 # Definition for a binary tree node.
 2 # class TreeNode(object):
 3 #     def __init__(self, val=0, left=None, right=None):
 4 #         self.val = val
 5 #         self.left = left
 6 #         self.right = right
 7 class Solution(object):
 8     def invertTree(self, root):
 9         """
10         :type root: TreeNode
11         :rtype: TreeNode
12         """
13         #1.递归法:前序遍历
14         if not root:#为空。返回None
15             return None
16         #交换左右节点
17         root.left, root.right = root.right, root.left
18         #遍历
19         self.invertTree(root.left)
20         self.invertTree(root.right)
21 
22         return root
23 
24         #2.迭代法:前序遍历
25         if not root:
26             return None
27         stack = [root] #栈
28         while stack:
29             node = stack.pop()
30             node.left, node.right = node.right, node.left
31             if node.left:
32                 stack.append(node.left)
33             if node.right:
34                 stack.append(node.right)
35 
36         return root

ps:之后再看其他实现方法。

101. 对称二叉树

【注意】

1.二叉树最终考察的是我们如何遍历。

2.收集左右孩子节点的信息返回给根节点,所以使用后序。

3.判断左右子树是否可以反转。

【代码】

 1 # Definition for a binary tree node.
 2 # class TreeNode(object):
 3 #     def __init__(self, val=0, left=None, right=None):
 4 #         self.val = val
 5 #         self.left = left
 6 #         self.right = right
 7 class Solution(object):
 8     def isSymmetric(self, root):
 9         """
10         :type root: TreeNode
11         :rtype: bool
12         """
13         #1.递归法
14         #终止条件,root为空时也是对称的,所以返回True
15         if not root:
16             return True
17         return self.compare(root.left,root.right)
18 
19     def compare(self, left, right):
20         #首先排除空节点的情况
21         if left == None and right != None: return flase
22         elif left != None and right == None: return False
23         elif left == None and right == None: return True
24         #排除了空节点,再排除数值不相同的情况
25         elif left.val != right.val: return False
26         
27         #此时就是:左右节点都不为空,且数值相同的情况
28         #此时才做递归,做下一层的判断
29         outside = self.compare(left.left, right.right) #左子树:左、 右子树:右
30         inside = self.compare(left.right, right.left) #左子树:右、 右子树:左
31         isSame = outside and inside #左子树:中、 右子树:中 (逻辑处理)
32         
33         return isSame

ps:二刷再看其他实现方法。

标签:node,right,root,self,随想录,遍历,二叉树,第十五天,left
From: https://www.cnblogs.com/wuyijia/p/17432018.html

相关文章

  • 代码随想录Day8|字符串
    主要是学了java的字符串用法,题目不是很难使用StringBuilder类型可以节省时间,关于这个类型的添加和使用chartemp=sb.charAt(start);sb.setCharAt(start,sb.charAt(end));sb.setCharAt(end,temp);151.翻转字符串里的单词 https://leetcode.cn/problems/reverse-words......
  • 代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素
    二分查找给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1。示例1:输入:nums=[-1,0,3,5,9,12],target=9输出:4解释:9出现在nums中并且下标为4示例2:输入:nums=[-1,0,3,......
  • 【剑指offer】-把二叉树打印成多行-43/67
    1.题目描述从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。2.题目分析非常经典的一道二叉树的题目,做这道题之前需要掌握二叉树的思想和BFS(广度优先搜索、队列思想)我们可以回顾一下最基本的层次遍历,我们是用一个队列来进行存储初始root结点,然后依次放入root的......
  • 【力扣每日一题】144. 二叉树的前序遍历
    1.题目描述2.题目解析非常典型的一道二叉树题目思路一:递归求解思路二:迭代求解3.题目代码3.1递归**publicIList<int>PreorderTraversal(TreeNoderoot){List<int>list=newList<int>();Tree(root,list);returnlist;......
  • LeetCode 222. 完全二叉树的节点个数
    classSolution{public:intcountNodes(TreeNode*root){if(!root)return0;autol=root->left,r=root->right;intx=1,y=1;//记录左右两边层数while(l)l=l->left,x++;while(r)r=r->right,y++;......
  • 加分二叉树
    题目描述设一个\(n\)个节点的二叉树\(\text{tree}\)的中序遍历为\((1,2,3,\ldots,n)\),其中数字\(1,2,3,\ldots,n\)为节点编号。每个节点都有一个分数(均为正整数),记第\(i\)个节点的分数为\(d_i\),\(\text{tree}\)及它的每个子树都有一个加分,任一棵子树\(\text{subtree}\)......
  • 代码随想录算法训练营第十四天|144. 二叉树的前序遍历、145. 二叉树的后序遍历、94.
    【参考链接】1.满二叉树,完全二叉树,二叉搜索树(有数值,有序树)。2.平衡二叉搜索树:又被称为AVL(Adelson-VelskyandLandis)树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。3.优先级队列其实是一个堆,堆就是一棵完全二叉......
  • 图解LeetCode——剑指 Offer 34. 二叉树中和为某一值的路径
    一、题目给你二叉树的根节点root和一个整数目标和targetSum,找出所有从根节点到叶子节点路径总和等于给定目标和的路径。叶子节点是指没有子节点的节点。二、示例2.1>示例1:【输入】root=[5,4,8,11,null,13,4,7,2,null,null,5,1],targetSum=22【输出】[[5,4,11,2],[5,......
  • 图解LeetCode——662. 二叉树最大宽度(难度:中等)
    一、题目给你一棵二叉树的根节点root,返回树的最大宽度。树的最大宽度是所有层中最大的宽度。每一层的宽度被定义为该层最左和最右的非空节点(即,两个端点)之间的长度。将这个二叉树视作与满二叉树结构相同,两端点间会出现一些延伸到这一层的null节点,这些null节点也计入长......
  • 图解LeetCode——剑指 Offer 07. 重建二叉树
    一、题目输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。二、示例2.1>示例1:【输入】preorder=[3,9,20,15,7],inorder=[9,3,15,20,7]【输出】[3,9,20,null,null,15,7]2.2>示例2:【输入】pr......