将有序数组转化为二叉搜索树
描述:
给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。
高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。
思路:
递归中写一个方法 (1)利用中序遍历保证稳定性,若l>r,代表没有节点,返回null(为什么不是l>=r , 若r在l后一位,递归返回到这一层执行右边,l+1=r直接返回不能打印这个节点) (2)找到中间节点作为根节点,递归左右子树,返回root (3)在主方法中直接return
代码:
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
if(nums == null) return null;
return bst(nums, 0 , nums.length - 1);
}
public TreeNode bst(int[] nums, int l, int r){
if(l > r) return null;
int mid = l + (r - l)/2;
TreeNode root = new TreeNode(nums[mid]);
root.left = bst(nums, l, mid - 1);
root.right = bst(nums, mid + 1, r);
return root;
}
}
二叉搜索树的第k大节点
描述:
给定一棵二叉搜索树,请找出其中第k大的节点
思路:
利用搜索二叉树的性质,根节点的左孩子节点小于根,右孩子节点大于根,中序遍历左根右是升序排序的 所以要找最大的使用中序遍历逆序就是从大到小排列,找第k个节点 (1)找第k个结果做3件事,应该使用类变量来维护count,res保证只有一份 定义count来计数,统计当前节点序号 找到k节点是,记录结果res 找到后终止递归提前返回 (2)构造逆序中序遍历函数dfs,参数为root 判断若根节点为空或count==1,直接返回 逆序,所以递归右子树,直到递归到最右节点,为最大节点 判断此时的根节点是否为第k大的,if(--count==0)(认为count为0代表找到,若是第一个则对应count就是0,记录后计数器--,所以直接--count即可),符合用res记录val值,提前返回return跳出dfs函数 (3)递归遍历左子树 (4)res以近乎记录了,返回res即可
?
代码:
class Solution {
int count, res;
public int kthLargest(TreeNode root, int k) {
this.count = k;
dfs(root);
return res;
}
public void dfs(TreeNode root){
if(root == null || count == 0) return;
dfs(root.right);
if(--count == 0){
res = root.val;
return;
}
dfs(root.left);
}
}
|