首页 > 编程语言 >代码随想录算法训练营第十七天|110. 平衡二叉树、257. 二叉树的所有路径

代码随想录算法训练营第十七天|110. 平衡二叉树、257. 二叉树的所有路径

时间:2023-05-27 20:12:17浏览次数:51  
标签:right self 随想录 height 二叉树 root 257 left

【参考链接】

110. 平衡二叉树

【注意】

1.一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。

2.求高度一定要用后序遍历。

【代码】

 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 isBalanced(self, root):
 9         """
10         :type root: TreeNode
11         :rtype: bool
12         """
13         if self.get_height(root) != -1:
14             return True
15         else:
16             return False
17     
18     def get_height(self,root):
19         if not root:
20             return 0
21         
22         #左子树不是平衡二叉树直接返回-1
23         left_height = self.get_height(root.left)
24         if left_height == -1:
25             return -1
26         #右子树不是平衡二叉树直接返回-1
27         right_height = self.get_height(root.right)
28         if right_height == -1:
29             return -1
30         #中
31         if abs(left_height - right_height) > 1:
32             return -1
33         else:
34             return 1 + max(left_height,right_height)   

257. 二叉树的所有路径

【注意】

1.给定一个二叉树,返回所有从根节点到叶子节点的路径。

2.一定要使用前序遍历。

3.一个参数数组记录单条路径,一个数组记录所有路径。

4.在这道题目中将第一次涉及到回溯,因为我们要把路径记录下来,需要回溯来回退一个路径再进入另一个路径。

5.回溯和递归是一一对应的,有一个递归,就要有一个回溯。

6.回溯的本质是在回头的时候把状态改回来。

【代码】

 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 import copy
 8 
 9 class Solution(object):
10     def binaryTreePaths(self, root):
11         """
12         :type root: TreeNode
13         :rtype: List[str]
14         """
15         if not root:
16             return []
17         result = []
18         self.generate_paths(root, [], result)
19         return result
20     #递归+回溯(前序遍历:中左右)
21     def generate_paths(self, node, path, result):
22         #中,将节点值加入path中
23         path.append(node.val)
24         #如果最后一个节点是叶子节点,则将一条路径加入到result中,
25         if not node.left and not node.right:
26             #map(str, path) 将path列表中的所有元素转换为字符串类型,然后使用 “->” 符号进行连接,结果是一个字符串。
27             result.append('->'.join(map(str, path)))
28         #左,不为空时,遍历左子树时需要注意将当前路径的副本进行传递,以避免影响右子树的遍历。
29         if node.left:
30             self.generate_paths(node.left, copy.copy(path), result)
31         #右,不为空时
32         if node.right:
33             self.generate_paths(node.right, copy.copy(path), result)
34         #遍历完左子树和右子树后,我们需要将 path 列表中的最后一个元素弹出,以便回溯到它的父节点。
35         path.pop()

ps:还差一题,

标签:right,self,随想录,height,二叉树,root,257,left
From: https://www.cnblogs.com/wuyijia/p/17437130.html

相关文章

  • 5_26打卡_二叉树的创建与遍历(递归)
    #include<iostream>usingnamespacestd;typedefstructtree{ chardata; tree*lchild; tree*rchild;}tree;//递归实现创建树voidcreatTree(tree*&root){ charch; cin>>ch; if(ch=='0') { root=NULL; } else{ root=......
  • 链式二叉树的实现(c实现)
    本篇博客主要写了如何完成二叉树的前,中,后序遍历,查找特定值的节点,计算最大深度等。都是对二叉树的一些基本操作。二叉树基本操作头文件typedefcharBTDataType;typedefstructBinaryTreeNode{ BTDataTypedata; structBinaryTreeNode*left; structBinaryTreeNode*right;......
  • LeetCode 114. 二叉树展开为链表
    思路1classSolution{public:voidflatten(TreeNode*root){while(root){autop=root->left;if(p)//找到左儿子的右链{while(p->right)p=p->right;//将右链插入......
  • #yyds干货盘点# LeetCode程序员面试金典:二叉树展开为链表
    题目:给你二叉树的根结点root,请你将它展开为一个单链表:展开后的单链表应该同样使用TreeNode,其中right子指针指向链表中下一个结点,而左子指针始终为null。展开后的单链表应该与二叉树先序遍历顺序相同。 示例1:输入:root=[1,2,5,3,4,null,6]输出:[1,null,2,null,3,null,4,......
  • 653.最大二叉树
    给定一个不重复的整数数组 nums。 最大二叉树 可以用下面的算法从 nums递归地构建:创建一个根节点,其值为 nums中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值右边的 子数组后缀上 构建右子树。返回 nums构建的最大二叉树 ......
  • 代码随想录Day9|
    28.实现strStr() 在一个串中查找是否出现过另一个串,这是KMP的看家本领说到KMP,先说一下KMP这个名字是怎么来的,为什么叫做KMP呢。因为是由这三位学者发明的:Knuth,Morris和Pratt,所以取了三位学者名字的首字母。所以叫做KMP KMP主要应用在字符串匹配上。KMP的主要思想是当......
  • 代码随想录算法训练营第十五天|102. 二叉树的层序遍历、226. 翻转二叉树、101. 对称二
    【参考链接】102.二叉树的层序遍历 【注意】1.队列先进先出,符合一层一层遍历的逻辑,而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。而这种层序遍历方式就是图论中的广度优先遍历,只不过我们应用在二叉树上。2.遍历的时候要记录队列的大小。就可以知道哪些元素是第几层......
  • 代码随想录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的......