最大二叉树
1.解法
这道题和用前序遍历和中序遍历构造二叉树的思路类似:
给定一个nums,每次都要从nums中找到一个最大值作为根节点,然后nums的左边就用同样的方法构造根节点的左子树(重复操作),右边也用同样的方法构造根节点的右子树(重复操作)。其实这样的nums正是一棵树的中序遍历。但是我们知道只用中序遍历是无法构造一棵树的,所以题目还给了一个nums中最大值作为根节点的条件。所以有了上面的思路,我们可以用递归的方法解决这道题。
伪代码:
def 构造最大树(nums):
先从nums中找到最大值
用最大值构造一个节点作为根节点root
root.left = 构造最大树(最大值左边的数作为新的nums)
root.right = 构造最大树(最大值右边的数作为新的nums)
返回root
代码如下:
def constructMaximumBinaryTree(nums):
def traversal(leftindex,rightindex):# leftindex:当前传入nums的左边界;rightindex:当前传入nums的右边界
# 递归出口:如果这个nums中没有元素了
if leftindex>rightindex:
return None
# i:nums[leftindex:rightindex+1]中的最大值的索引
# nums[i]:nums[leftindex:rightindex+1]中的最大值
i = nums.index(max(nums[leftindex:rightindex+1]))
# 根据最大值构造root节点
maxnode = TreeNode(nums[i],None,None)
# 构造左子树
maxnode.left = traversal(leftindex,i-1)
# 构造右子树
maxnode.right = traversal(i+1,rightindex)
# 返回根节点
return maxnode
# 返回根节点
return traversal(0,len(nums)-1)
2.总结
python
list index方法:l.index(x,start,end):从 l [ s t a r t : e n d ] l[start:end] l[start:end]中找到 x x x的索引
算法
类似于通过两种遍历构造二叉树的方法,只不过这次只给了一个中序遍历+一个条件