654 最大二叉樹 遞迴 非遞迴

2021-09-12 11:44:12 字數 1914 閱讀 1036

給定乙個不含重複元素的整數陣列。乙個以此陣列構建的最大二叉樹定義如下:

二叉樹的根是陣列中的最大元素。

左子樹是通過陣列中最大值左邊部分構造出的最大二叉樹。

右子樹是通過陣列中最大值右邊部分構造出的最大二叉樹。

通過給定的陣列構建最大二叉樹,並且輸出這個樹的根節點。

example 1:

輸入:[3,2,1,6,0,5]輸入:返回下面這棵樹的根節點:

6/ \

3 5

\ /

2 0

\1

注意:

給定的陣列的大小在 [1, 1000] 之間。

思路:法1:遞迴  法二:利用棧實現非遞迴

遞迴解法:1.確定遞迴出口   2.確定遞迴條件

# definition for a binary tree node.

# class treenode(object):

# def __init__(self, x):

# self.val = x

# self.left = none

# self.right = none

class solution(object):

def constructmaximumbinarytree(self, nums):

""":type nums: list[int]

:rtype: treenode

"""if len(nums)<1:return none

# 遞迴

def max_tree(nums,left,right):

# 定義遞迴出口

if left==right: return treenode(nums[left])

max_val=max(nums[left:right+1])

mid=nums.index(max_val)

root=treenode(max_val)

# 一定不能掉遞迴條件!

if mid>left:

root.left=max_tree(nums,left,mid-1)

if mid非遞迴(單調棧):

單調棧:一般用於解決涉及到索引順序和值大小的問題(如:右邊乙個大,左邊第乙個大等問題)

# definition for a binary tree node.

# class treenode(object):

# def __init__(self, x):

# self.val = x

# self.left = none

# self.right = none

class solution(object):

def constructmaximumbinarytree(self, nums):

""":type nums: list[int]

:rtype: treenode

"""if len(nums)<1:return none

# 單調棧實現非遞迴 維護乙個自底向上的遞減棧

stack=

for num in nums:

node=treenode(num)

while stack and num>stack[-1].val:

node.left=stack.pop()

if stack and numstack[-1].right=node

return stack[0]

LeetCode 654 最大二叉樹(遞迴)

給定乙個不含重複元素的整數陣列。乙個以此陣列構建的最大二叉樹定義如下 二叉樹的根是陣列中的最大元素。左子樹是通過陣列中最大值左邊部分構造出的最大二叉樹。右子樹是通過陣列中最大值右邊部分構造出的最大二叉樹。通過給定的陣列構建最大二叉樹,並且輸出這個樹的根節點。示例 輸入 3,2,1,6,0,5 輸出 ...

最大二叉樹 p654 遞迴構造

與p106相似 package tree import sun.reflect.generics.tree.tree 給定乙個不含重複元素的整數陣列。乙個以此陣列構建的最大二叉樹定義如下 二叉樹的根是陣列中的最大元素。左子樹是通過陣列中最大值左邊部分構造出的最大二叉樹。右子樹是通過陣列中最大值右邊部...

654 最大二叉樹

給定乙個不含重複元素的整數陣列。乙個以此陣列構建的最大二叉樹定義如下 二叉樹的根是陣列中的最大元素。左子樹是通過陣列中最大值左邊部分構造出的最大二叉樹。右子樹是通過陣列中最大值右邊部分構造出的最大二叉樹。通過給定的陣列構建最大二叉樹,並且輸出這個樹的根節點。example 1 輸入 3,2,1,6,...