給定乙個不含重複元素的整數陣列。乙個以此陣列構建的最大二叉樹定義如下:
二叉樹的根是陣列中的最大元素。
左子樹是通過陣列中最大值左邊部分構造出的最大二叉樹。
右子樹是通過陣列中最大值右邊部分構造出的最大二叉樹。
通過給定的陣列構建最大二叉樹,並且輸出這個樹的根節點。
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,...