二叉搜索树
- 是一颗二叉树
- 所有左子树节点比根节点小,所有右子树节点比根节点大
- 根节点的后继节点就是后第一个比他大的节点,特点就是后继节点一定没有左子树
当删除一个节点时,将他的后继节点值补上去,然后再把后继节点右子树放在原后继节点位置
二叉搜索树增删查基本操作
删除操作是找到删除节点后继节点,将后继节点值赋值给删除节点,然后将后继节点右子树提上去 ```java package com.tuling.datastruct.suanfa; /**
- @author lfy 二叉搜索树的增删改
@date 2022-05-05 */ public class BinarySearchTree {
//树中插入元素 public void insert(TreeNode root,int data){
if (null != root){if (data > root.data){if (null != root.right){insert(root.right,data);}else {root.right = new TreeNode(data);}}else {if (null != root.left){insert(root.left,data);}else {root.left = new TreeNode(data);}}}
} //查询元素 public TreeNode find(TreeNode root,int data){
if (root.data == data){return root;}if (data > root.data){if (null != root.right){TreeNode treeNode = find(root.right, data);return treeNode;}else {return null;}}else {if (null != root.left){TreeNode treeNode = find(root.left, data);return treeNode;}else {return null;}}
} //删除元素,有三种情况 //删除节点是叶子节点直接删除 //删除节点有右子树,找到后继节点代替删除节点,再把后继节点删除 //删除节点有左子树,找到前驱节点代替删除节点,再把前驱节点删除 public TreeNode remove(TreeNode root,int data){
if (data < root.data){root.left = remove(root.left,data);}else if (data > root.data){root.right = remove(root.right,data);}else {if (root.left == null && root.right == null){root = null;}else if (root.right != null){root.data = findAfterNode(root);root.right = remove(root.right,root.data);}else {root.data = findBeforeNode(root.left);root.left = remove(root.left,root.data);}}return root;
}
private int findAfterNode(TreeNode root){
root = root.right;while (null != root.right){root = root.right;}return root.data;
} private int findBeforeNode(TreeNode root){
root = root.left;while (null != root){root = root.left;}return root.data;
}
public static void main(String[] args) {TreeNode root = new TreeNode(8);int[] param = new int[]{5,11,3,7,9,12,4,10};BinarySearchTree tree = new BinarySearchTree();for (int i : param) {tree.insert(root,i);}TreeNode treeNode = tree.find(root, 10);tree.remove(root,5);System.out.println(treeNode.data);System.out.println(treeNode.left.data);System.out.println(treeNode.right.data);}
}
<a name="qy6N6"></a>#### 二叉树的层序遍历,广度优先算法```javapackage com.alg.two;/*** @author fuyao* @date 2022年04月19日 5:20 下午*/public class IsSymmetric {public boolean isSymmetric(Node tree){return checkSymmetric(tree.left,tree.right);}public boolean checkSymmetric(Node left,Node right){if (left == null && right == null) {return true;}if (left == null || right == null){return false;}if (left.value != right.value){return false;}return checkSymmetric(left.left,right.right) && checkSymmetric(left.right,right.left);}public static void main(String[] args) {Node node1 = new Node(1);Node node3 = new Node(3);Node node2 = new Node(2,node1,node3);IsSymmetric tree = new IsSymmetric();System.out.println(tree.isSymmetric(node2));}static class Node{int value;Node left;Node right;public Node(int value) {this.value = value;}public Node(int value, Node left, Node right) {this.value = value;this.left = left;this.right = right;}}}
二叉树深度优先遍历优先
public void in(BinarySeachTree root) { //中序遍历if(root != null) {in(root.left);System.out.print(root.data + " ");in(root.right);}}
