二叉搜索树-合法性增删查

Posted z-d-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉搜索树-合法性增删查相关的知识,希望对你有一定的参考价值。

1. 定义

给定一个二叉树,判断其是否是一个有效的二叉搜索树。

假设一个二叉搜索树具有如下特征:

节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。

拓展:二分搜索

2. 框架

1 void BST(TreeNode root, int target) {
2     if (root.val == target)
3         // 找到目标,做点什么
4     if (root.val < target) 
5         BST(root.right, target);
6     if (root.val > target)
7         BST(root.left, target);
8 }

3. 判断合法性

 1 public boolean isValidBST(TreeNode root) {
 2         return isValidBST(root, null, null);
 3     }
 4     public boolean isValidBST(TreeNode root, TreeNode min, TreeNode max){
 5         if(root == null)
 6             return true;
 7         if(min != null && root.val <= min.val) return false;
 8         if(max != null && root.val >= max.val) return false;
 9         return isValidBST(root.left, min, root) && isValidBST(root.right, root, max);
10     }

4. 查找一个数字

1 boolean isInBST(TreeNode root, int target) {
2     if (root == null) return false;
3     if (root.val == target)
4         return true;
5     if (root.val < target) 
6         return isInBST(root.right, target);
7     if (root.val > target)
8         return isInBST(root.left, target);
9 }

  查找一个数,返回节点及子树

 1 public TreeNode searchBST(TreeNode root, int val) {
 2         if(root == null)
 3             return root;
 4         if(root.val == val)
 5             return root;
 6         if(root.val < val)
 7             return searchBST(root.right, val);
 8         if(root.val > val)
 9             return searchBST(root.left, val);
10         return root;
11     }

5. 插入一个数

1 public TreeNode insertIntoBST(TreeNode root, int val) {
2         if(root == null)
3             return new TreeNode(val);
4         if(root.val < val)
5             root.right = insertIntoBST(root.right, val);
6         if(root.val > val)
7             root.left = insertIntoBST(root.left, val);
8         return root;
9     }

6. 删除一个数

  注意:该节点的左右子树是否有内容?都为空;一个为空;都不为空。

 1 public TreeNode deleteNode(TreeNode root, int key) {
 2         if(root == null)
 3             return null;
 4         if(root.val == key){
 5             if(root.left == null && root.right == null) return null;
 6             if(root.left == null) return root.right;
 7             if(root.right == null) return root.left;
 8             if(root.left != null && root.right != null){
 9                 TreeNode min = getMin(root.right);
10                 root.val = min.val;
11                 root.right = deleteNode(root.right, min.val);
12             }
13         }else if(root.val < key){
14             root.right = deleteNode(root.right, key);
15         }else{
16             root.left = deleteNode(root.left, key);
17         }
18         return root;
19     }
20     public TreeNode getMin(TreeNode node){
21         while(node.left != null)
22             node = node.left;
23         return node;
24 }

以上是关于二叉搜索树-合法性增删查的主要内容,如果未能解决你的问题,请参考以下文章

数据结构:二叉搜索树的增删查改

二叉搜索树的思想,以及增删查改的实现

二叉搜索树

数据结构----搜索二叉树

js树形结构-----二叉树增删查

BST | 二叉搜索树的基本操作(Java)