> 文章列表 > 二叉搜索树专题

二叉搜索树专题

二叉搜索树专题

二叉搜索树专题

  • 特性篇
    • LeetCode 230. 二叉搜索树中第K小的元素
    • 解题思路
    • 代码实现
    • LeetCode 538. 把二叉搜索树转换为累加树
    • 解题思路
    • 代码实现
  • 基操篇
    • LeetCode 98. 验证二叉搜索树
    • 解题思路
    • 代码实现
    • LeetCode 700. 二叉搜索树中的搜索
    • 代码实现
    • LeetCode 701. 二叉搜索树中的插入操作
    • 解题思路
    • 代码实现
    • 总结


不要纠结,干就完事了,熟练度很重要!!!多练习,多总结!!!

特性篇

LeetCode 230. 二叉搜索树中第K小的元素

二叉搜索树专题

解题思路

二叉搜索树的中序遍历是结果是从小到大排列!

代码实现

class Solution {int rank = 0;int res;public int kthSmallest(TreeNode root, int k) {traverse(root, k);return res;}public void traverse(TreeNode root, int k){if(root == null){return ;}traverse(root.left,k);rank++;if(k == rank){res = root.val;}traverse(root.right, k);}
}

LeetCode 538. 把二叉搜索树转换为累加树

二叉搜索树专题
二叉搜索树专题

解题思路

二叉搜索树中序遍历从小到大排列,左右节点反过来遍历,就是从大到小排列,那么维护一个变量统计累计和即可。

代码实现

class Solution {int sum = 0;public TreeNode convertBST(TreeNode root) {traverse(root);return root;}public void traverse(TreeNode root){if(root == null){return ;}traverse(root.right);sum+=root.val;root.val = sum;traverse(root.left);}
}

基操篇

LeetCode 98. 验证二叉搜索树

二叉搜索树专题

解题思路

注意本题二叉搜索树的合法性不仅是当前节点的左右子树需要满足条件,左右子树的子树也需要满足(即递归实现)。

代码实现

class Solution {public boolean isValidBST(TreeNode root) {return isValidBST(root, null,null);}public boolean isValidBST(TreeNode root, TreeNode min, TreeNode max){if(root == null){return true;}if(min != null && root.val <= min.val){return false;}if(max != null && root.val >= max.val){return false;}return isValidBST(root.left, min, root) && isValidBST(root.right, root, max);}
}

LeetCode 700. 二叉搜索树中的搜索

二叉搜索树专题

代码实现

class Solution {public TreeNode searchBST(TreeNode root, int val) {if(root == null){return null;}if(root.val == val){return root;}else if(root.val > val){return searchBST(root.left, val);}else {return searchBST(root.right, val);}}
}

LeetCode 701. 二叉搜索树中的插入操作

二叉搜索树专题

解题思路

二叉搜索树专题

if (root.left == null && root.right == null)return null;

二叉搜索树专题

// 排除了情况 1 之后
if (root.left == null) return root.right;
if (root.right == null) return root.left;

二叉搜索树专题

if (root.left != null && root.right != null) {// 找到右子树的最小节点TreeNode minNode = getMin(root.right);// 把 root 改成 minNoderoot.val = minNode.val;// 转而去删除 minNoderoot.right = deleteNode(root.right, minNode.val);
}

代码实现

class Solution {public TreeNode deleteNode(TreeNode root, int key) {if(root == null){return null;}if(root.val > key){root.left = deleteNode(root.left, key);}else if(root.val < key){root.right = deleteNode(root.right, key);}else{if(root.left == null){return root.right;}else if (root.right == null){return root.left;}else {TreeNode min = getMin(root.right);root.val = min.val;root.right = deleteNode(root.right, min.val);}}return root;}public TreeNode getMin(TreeNode node) {while (node.left != null) node = node.left;return node;} 
}

总结

本题来源于Leetcode中 归属于二叉树类型题目。
同许多在算法道路上不断前行的人一样,不断练习,修炼自己!
如有博客中存在的疑问或者建议,可以在下方留言一起交流,感谢各位!

觉得本博客有用的客官,可以给个点赞+收藏哦! 嘿嘿

喜欢本系列博客的可以关注下,以后除了会继续更新面试手撕代码文章外,还会出其他系列的文章!