递归
public class Solution {
public TreeNode constructMaximumBinaryTree(int[] nums) {
return construct(nums, 0, nums.length);
}
public TreeNode construct(int[] nums, int l, int r) {
if (l == r)
return null;
int max_i = max(nums, l, r);
TreeNode root = new TreeNode(nums[max_i]);
root.left = construct(nums, l, max_i);
root.right = construct(nums, max_i + 1, r);
return root;
}
public int max(int[] nums, int l, int r) {
int max_i = l;
for (int i = l; i < r; i++) {
if (nums[max_i] < nums[i])
max_i = i;
}
return max_i;
}
}
单调栈
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public TreeNode constructMaximumBinaryTree(int[] nums) {
//nums中共有n个数
int n = nums.length;
//单调栈 (单调递减结构)
Deque<TreeNode> deque = new LinkedList<>();
for(int i = 0; i < n;i++){
//以当前值为val创建一个节点
//当前节点
TreeNode currNode = new TreeNode(nums[i]);
//若栈底节点的val小于当前节点的val 弹出栈底节点
while(deque.size() != 0 && deque.peekLast().val < currNode.val){
TreeNode lastNode = deque.pollLast();
if(deque.size() == 0)
currNode.left = lastNode;
else if(deque.size()!=0 && deque.peekLast().val > currNode.val)
currNode.left = lastNode;
else if(deque.size()!=0 && deque.peekLast().val < currNode.val)
deque.peekLast().right = lastNode;
}
deque.offerLast(currNode);
}
TreeNode node = null;
TreeNode ans = null;
while(deque.size() != 0){
ans = deque.pollLast();
ans.right = node;
node = ans;
}
return ans;
}
}