1.左边节点的值总是小于等于根节点,右边节点的值总是大于等于根节点
修建二叉树:把二叉树的每个节点的值限制在一个范围<L,R>之间
思路:先判断根节点的值;如果根节点的值,大于R,则递归左子树的值,根节点+右子树被全部抛弃;
如果根节点的值,小于L,则递归右子树的值,根节点+左子树被全部抛弃;
如果根节点位于两个值之间,则开始递归求解左子树/右子树是否满足上述条件。
public TreeNode trimBST(TreeNode root, int L, int R) {
if (root == null) return null;
if (root.val > R) return trimBST(root.left, L, R);
if (root.val < L) return trimBST(root.right, L, R);
root.left = trimBST(root.left, L, R);
root.right = trimBST(root.right, L, R);
return root;
}
2.查找二叉搜索树的第K个最小值
利用二叉搜索树的节点个数进行判断
左节点的值:计算出二叉树左节点的个数,如果左节点的个数等于k-1;则根节点就是我们要找的值,如果左节点的个数大于k-1,表明我们要查找的第k个最小元素在左子树中,如果左节点的个数小于k-1,表明要查找的第k个最小元素在右子节点中,找到右子树中第k-count(left)-1个元素就是我们要找的元素
class Solution {
public int kthSmallest(TreeNode root, int k) {
/*
迭代
*/
int leftcon=count(root.left);
if(leftcon==k-1) return root.val;
if(leftcon>k-1) return kthSmallest(root.left, k);
return kthSmallest( root.right, k-leftcon-1);
}
public int count(TreeNode root){
if(root==null) return 0;
return 1+count(root.left)+count(root.right);
}
}
中序遍历求解思路:
先遍历左子树,再遍历右子树,求第k个值
class Solution {
private int cnt=0;
private int val;
public int kthSmallest(TreeNode root, int k) {
//中序遍历
inOrder(root,k);
return val;
}
public void inOrder(TreeNode node,int k){
if(node==null) return;
inOrder(node.left,k);
cnt++;
if(cnt==k){
val=node.val;
return;
}
inOrder(node.right,k);
}
}
3.将二叉查找树的所有节点的大于等于他的节点的值进行累加。
思路:先遍历右节点,将当前节点的右节点的值与此节点相加,然后修改当前节点的值为累加后的和;最后遍历左子树,加上修改后的根节点的值。
private int sum = 0;
public TreeNode convertBST(TreeNode root) {
traver(root);
return root;
}
private void traver(TreeNode node) {
if (node == null) return;
traver(node.right);
sum += node.val;
node.val = sum;
traver(node.left);
}