代码随想录 669. 修剪二叉搜索树 | 108.将有序数组转换为二叉搜索树 | 538.把二叉搜索树转换为累加树
669 修剪二叉搜索树
给定一个二叉搜索树,同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树,使得所有节点的值在[L, R]中 (R>=L) 。你可能需要改变树的根节点,所以结果应当返回修剪好的二叉搜索树的新的根节点。
修剪的操作并不是在终止条件上进行的,所以就是遇到空节点返回就可以了。
如果root(当前节点)的元素小于low的数值,那么应该递归右子树,并返回右子树符合条件的头结点。
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public TreeNode trimBST(TreeNode root, int L, int R) { if (root == null) return null; if (root.val < L) return trimBST(root.right, L , R); if (root.val > R) return trimBST(root.left, L , R); root.left = trimBST(root.left, L, R); root.right = trimBST(root.right, L, R); return root; } }
.将有序数组转换为二叉搜索树
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。
确定递归终止条件 这里定义的是左闭右闭的区间,所以当区间 left > right的时候,就是空节点了。
root的左孩子接住下一层左区间的构造节点,右孩子接住下一层右区间构造的节点。
/** * 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 sortedArrayToBST(int[] nums) { return helper(0, nums.length - 1, nums ); } private TreeNode helper(int left, int right, int[] nums) { if (left > right) return null; int p = (left + right) / 2; TreeNode root = new TreeNode(nums[p]); root.left = helper(left, p - 1, nums); root.right = helper(p + 1, right, nums); return root; } }
538. 把二叉搜索树转换为累加树
给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node
的新值等于原树中大于或等于 node.val
的值之和。
利用中序遍历
class Solution { int sum = 0; public TreeNode convertBST(TreeNode root) { sum = 0; helper(root); return root; } private void helper(TreeNode root) { if (root == null) return; helper(root.right); sum += root.val; root.val = sum; helper(root.left); } }