对于树中的每个结点,左子树中所有相的值小于跟根节点的值,右子树中所有相的值大于根节点的值
类似于二叉树的建立,再建立左右子树之前需要判断输入值的相对于根节点的大小
创建二叉搜索树
struct BinaryTree { int data; BinaryTree* left; BinaryTree* right; } BinaryTree* CreatBST (BinaryTree* Root , int val) { if (root == nullptr)//如果为空的二叉树,便将新的节点设定为根节点 { root = new Binarytree; root->data = val; root->left = nullptr; root->right = nullptr; } else if (root->data < val)//如果新值比节点值大,递归地建立右子树 root->right = CreatBST(root->right, val); else if (root->data > val)//如果新值比节点值小,递归地建立左子树 root->left = CreatBST(root->left, val); else exit(-1); return root; }1 找到 二叉搜索树中的某个值。或者是判断二叉搜索树中是否存在某个值,若存在,返回true,不存在,返回false.
BinaryTree* FindBST (BinaryTree* Root , int val) { if(Root == nullptr) return nullptr; if (val == Root->data) return Root; if(val > Root->data) return FindBST ( Root->right, int val); if(val < Root->data) return FindBST ( Root->left, int val); } // bool FindBST (BinaryTree* Root , int val) { if(Root == nullptr) return false; if(val > Root->data) return FindBST ( Root->right, int val); if(val < Root->data) return FindBST ( Root->left, int val); else return true; }2 找到最大的节点,或者找到最小的节点
//现在返回的是节点,看清楚是要求返回节点或者值 BinaryTree* FindminBST (BinaryTree* Root ) { if(Root == nullptr) return nullptr; if ( Root-> left == null) return Root; else return FindminBST ( Root->left); } // BinaryTree* FindmaxBST (BinaryTree* Root ) { if(Root == nullptr) return nullptr; if ( Root-> right == null) return Root; else return FindmaxBST ( Root->right); }搜索树的插入相比于二叉树的插入 需要判断相对于根节点的大小
//若是空树,就先创建一个,否则进行递归,直到找到符合判断条件后,以该值创建节点。 void BinaryTree* Insert (BinaryTree* Root , int val) { if(Root == null) { BinaryTree* Root == new BinaryTree(); Root->data = val; Root->left = null; Root->right = null; } if(Root->data > val) Insert ( Root->left , int val); else if Root->data < val) Insert ( Root->right , int val); }
分为以下三种情况:
1. 若删除的节点没有孩子的时候,直接删除此节点,然后将父节点NULL;
2.若删除的节点有一个孩子的时候,直接将父节点连接到其孩子节点,然后删除此节点。
3.若有两个节点的时候,这时候就要找个节点代替它了,因为二叉搜索树具有左子树比此节点的值都小,右子树比此节点的值大,所以(1)可以找左子树中节点最大的元素,也就是左子树中最右端的元素,(2)也可以找右子树中节点最小的元素,也就是右子树中最左端的节点。让此节点的值等于子树中选出的值,然后删除子树中的节点,因为被删除的节点不是在最右端就是在最左端,所以可知此节点只有一个孩子。。。。然后转到第二种情况。。。
具体参考博客:https://blog.csdn.net/qq_41410799/article/details/80903484