mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-08 16:54:50 +08:00
Merge pull request #748 from RyouMon/master
优化 0257.二叉树的所有路径.md Python3解法; 修复 0654.最大二叉树.md Python3解法
This commit is contained in:
@ -408,25 +408,57 @@ class Solution {
|
|||||||
Python:
|
Python:
|
||||||
```Python
|
```Python
|
||||||
class Solution:
|
class Solution:
|
||||||
|
"""二叉树的所有路径 递归法"""
|
||||||
|
|
||||||
def binaryTreePaths(self, root: TreeNode) -> List[str]:
|
def binaryTreePaths(self, root: TreeNode) -> List[str]:
|
||||||
path=[]
|
path, result = '', []
|
||||||
res=[]
|
self.traversal(root, path, result)
|
||||||
def backtrace(root, path):
|
return result
|
||||||
if not root:return
|
|
||||||
path.append(root.val)
|
def traversal(self, cur: TreeNode, path: List, result: List):
|
||||||
if (not root.left)and (not root.right):
|
path += str(cur.val)
|
||||||
res.append(path[:])
|
# 如果当前节点为叶子节点,添加路径到结果中
|
||||||
ways=[]
|
if not (cur.left or cur.right):
|
||||||
if root.left:ways.append(root.left)
|
result.append(path)
|
||||||
if root.right:ways.append(root.right)
|
return
|
||||||
for way in ways:
|
|
||||||
backtrace(way,path)
|
if cur.left:
|
||||||
path.pop()
|
self.traversal(cur.left, path + '->', result)
|
||||||
backtrace(root,path)
|
|
||||||
return ["->".join(list(map(str,i))) for i in res]
|
if cur.right:
|
||||||
|
self.traversal(cur.right, path + '->', result)
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```python
|
||||||
|
from collections import deque
|
||||||
|
|
||||||
|
|
||||||
|
class Solution:
|
||||||
|
"""二叉树的所有路径 迭代法"""
|
||||||
|
|
||||||
|
def binaryTreePaths(self, root: TreeNode) -> List[str]:
|
||||||
|
# 题目中节点数至少为1
|
||||||
|
stack, path_st, result = deque([root]), deque(), []
|
||||||
|
path_st.append(str(root.val))
|
||||||
|
|
||||||
|
while stack:
|
||||||
|
cur = stack.pop()
|
||||||
|
path = path_st.pop()
|
||||||
|
# 如果当前节点为叶子节点,添加路径到结果中
|
||||||
|
if not (cur.left or cur.right):
|
||||||
|
result.append(path)
|
||||||
|
if cur.right:
|
||||||
|
stack.append(cur.right)
|
||||||
|
path_st.append(path + '->' + str(cur.right.val))
|
||||||
|
if cur.left:
|
||||||
|
stack.append(cur.left)
|
||||||
|
path_st.append(path + '->' + str(cur.left.val))
|
||||||
|
|
||||||
|
return result
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
Go:
|
Go:
|
||||||
```go
|
```go
|
||||||
func binaryTreePaths(root *TreeNode) []string {
|
func binaryTreePaths(root *TreeNode) []string {
|
||||||
|
@ -258,16 +258,30 @@ class Solution {
|
|||||||
## Python
|
## Python
|
||||||
|
|
||||||
```python
|
```python
|
||||||
//递归法
|
|
||||||
class Solution:
|
class Solution:
|
||||||
|
"""最大二叉树 递归法"""
|
||||||
|
|
||||||
def constructMaximumBinaryTree(self, nums: List[int]) -> TreeNode:
|
def constructMaximumBinaryTree(self, nums: List[int]) -> TreeNode:
|
||||||
if not nums: return None //终止条件
|
return self.traversal(nums, 0, len(nums))
|
||||||
root = TreeNode(max(nums)) //新建节点
|
|
||||||
p = nums.index(root.val) //找到最大值位置
|
def traversal(self, nums: List[int], begin: int, end: int) -> TreeNode:
|
||||||
if p > 0: //保证有左子树
|
# 列表长度为0时返回空节点
|
||||||
root.left = self.constructMaximumBinaryTree(nums[:p]) //递归
|
if begin == end:
|
||||||
if p < len(nums): //保证有右子树
|
return None
|
||||||
root.right = self.constructMaximumBinaryTree(nums[p+1:]) //递归
|
|
||||||
|
# 找到最大的值和其对应的下标
|
||||||
|
max_index = begin
|
||||||
|
for i in range(begin, end):
|
||||||
|
if nums[i] > nums[max_index]:
|
||||||
|
max_index = i
|
||||||
|
|
||||||
|
# 构建当前节点
|
||||||
|
root = TreeNode(nums[max_index])
|
||||||
|
|
||||||
|
# 递归构建左右子树
|
||||||
|
root.left = self.traversal(nums, begin, max_index)
|
||||||
|
root.right = self.traversal(nums, max_index + 1, end)
|
||||||
|
|
||||||
return root
|
return root
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user