题目:
给定一个不重复的整数数组 nums
。 最大二叉树 可以用下面的算法从 nums
递归地构建:
- 创建一个根节点,其值为
nums
中的最大值。 - 递归地在最大值 左边 的 子数组前缀上 构建左子树。
- 递归地在最大值 右边 的 子数组后缀上 构建右子树。
返回 nums
构建的 最大二叉树 。
/** 单调栈、递归* 思路:单调栈* 根据题目对于二叉树的构建描述,nums 中的任二节点所在构建树的水平截面上的位置仅由下标大小决定。* 栈中的元素从栈底到栈顶是单调递减的。* 栈顶元素大于待插入的元素,带插入元素入栈,同时维护二叉树,待插入元素是栈顶元素的右子树。* 若小于待插入元素,栈顶元素出栈,同时维护二叉树,栈顶元素是待插入元素的左子树。* * 参考链接:https://leetcode.cn/problems/maximum-binary-tree/solutions/1762400/zhua-wa-mou-si-by-muse-77-myd7/* @auther start* @create 2023-11-28 18:56*/
public class L654 {public TreeNode constructMaximumBinaryTree(int[] nums) {Deque<TreeNode> stack = new LinkedList<>();for (int i = 0; i < nums.length; i++) {TreeNode node = new TreeNode(nums[i]);
// 栈顶元素和待插入元素进行比较while (!stack.isEmpty()) {TreeNode topNode = stack.peek();//栈顶元素大于待插入元素if (topNode.val > node.val) {stack.push(node);topNode.right = node;break;} else {stack.pop();node.left = topNode;}}if (stack.isEmpty()) stack.push(node);}return stack.peekLast();}
}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;}
}