高温预警:你知道二叉树、二叉搜索树、二叉排序树、二叉平衡树有什么区别吗?
废话不多说,让我们直接进入正题,让我们来看看二叉树、二叉搜索树、二叉排序树、二叉平衡树有什么区别吧!
1.二叉树二叉树是一种特殊的树形结构,每个节点最多只有两个子节点。二叉树的特点如下:
●每个节点最多只有两个子节点
●左右树是有序的
●即使只有一棵子树,也要区分左右子树
二叉树是每个节点最多有两棵子树的树结构。子树通常被称为左子树和右子树。二叉树的定义如下:
public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; }}
二叉树的遍历方式有三种,分别是前序遍历、中序遍历和后序遍历。
2.二叉查找树二叉搜索树,又称二叉搜索树,二叉排序树,它要么是一棵空树,要么是具有以下性质的二叉树:
●若其左子树不空,则左子树上所有结点的值均小于其根节点的值;
●如果右子树不空,右子树上所有结点的值都大于其根节点的值;
●它的左右树也是二叉树。
二叉搜索树的实现代码如下:
public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; }}public class BinarySearchTree { private TreeNode root; public void insert(int val) { root = insert(root, val); } private TreeNode insert(TreeNode root, int val) { if (root == null) { return new TreeNode(val); } if (val < root.val) { root.left = insert(root.left, val); } else if (val > root.val) { root.right = insert(root.right, val); } return root; } public boolean search(int val) { return search(root, val); } private boolean search(TreeNode root, int val) { if (root == null) { return false; } if (root.val == val) { return true; } else if (val < root.val) { return search(root.left, val); } else { return search(root.right, val); } }}
二叉搜索树的遍历方式与二叉树相同,即前序遍历、中序遍历、后序遍历。
3.二叉排序树二叉排序树(BST)它是一种特殊的二叉树,每个节点都满足左树上所有节点的值小于节点的值,右树上所有节点的值大于节点的值。BST的特点如下:
●左树上所有节点的值都小于节点的值
●右子树上所有节点的值都大于节点
●左右子树都是BST
二叉排序树的实现代码如下:
public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; }}public class BinarySortTree { private TreeNode root; public void insert(int val) { root = insert(root, val); } private TreeNode insert(TreeNode root, int val) { if (root == null) { return new TreeNode(val); } if (val < root.val) { root.left = insert(root.left, val); } else if (val > root.val) { root.right = insert(root.right, val); } return root; } public boolean search(int val) { return search(root, val); } private boolean search(TreeNode root, int val) { if (root == null) { return false; } if (root.val == val) { return true; } else if (val < root.val) { return search(root.left, val); } else { return search(root.right, val); } }}
二叉排序树的遍历方式与二叉树相同,即前序遍历、中序遍历、后序遍历。
4.二叉平衡树二叉平衡树是一种特殊的二叉排序树,每个节点的左右子树高度差不超过1。二叉平衡树的特点如下:
●每个节点左右子树的高度差不得超过1
●左右子树均为平衡二叉树
实现二叉平衡树的代码如下:
public class TreeNode { int val; TreeNode left; TreeNode right; int height; TreeNode(int x) { val = x; }}public class AVLTree { private TreeNode root; private int height(TreeNode node) { if (node == null) { return -1; } else { return node.height; } } private int max(int a, int b) { return a > b ? a : b; } private TreeNode rightRotate(TreeNode y) { TreeNode x = y.left; TreeNode T2 = x.right; x.right = y; y.left = T2; y.height = max(height(y.left), height(y.right)) + 1; x.height = max(height(x.left), height(x.right)) + 1; return x; } private TreeNode leftRotate(TreeNode x) { TreeNode y = x.right; TreeNode T2 = y.left; y.left = x; x.right = T2; x.height = max(height(x.left), height(x.right)) + 1; y.height = max(height(y.left), height(y.right)) + 1; return y; } private int getBalance(TreeNode node) { if (node == null) { return 0; } else { return height(node.left) - height(node.right); } } public void insert(int val) { root = insert(root, val); } private TreeNode insert(TreeNode root, int val) { if (root == null) { return new TreeNode(val); } if (val < root.val) { root.left = insert(root.left, val); } else if (val > root.val) { root.right = insert(root.right, val); } else { return root; } root.height = 1 + max(height(root.left), height(root.right)); int balance = getBalance(root); if (balance > 1 && val < root.left.val) { return rightRotate(root); } if (balance < -1 && val > root.right.val) { return leftRotate(root); } if (balance > 1 && val > root.left.val) { root.left = leftRotate(root.left); return rightRotate(root); } if (balance < -1 && val < root.right.val) { root.right = rightRotate(root.right); return leftRotate(root); } return root; } public boolean search(int val) { return search(root, val); } private boolean search(TreeNode root, int val) { if (root == null) { return false; } if (root.val == val) { return true; } else if (val < root.val) { return search(root.left, val); } else { return search(root.right, val); } }}
二叉平衡树的遍历方式与二叉树相同,即前序遍历、中序遍历、后序遍历。
5.总结二叉树、二叉搜索树、二叉排序树、二叉平衡树都是树结构的一种形式,但它们在实现和使用上有很大的不同。二叉搜索树和二叉排序树都是在二叉树的基础上进行优化的,可以更快地找到特定的数据。二叉平衡树是为了解决极端情况下二叉搜索树退化为链表的问题而提出的。它确保每个节点左右子树的高度差不超过1,使树的高度始终保持在O(logn)的级别。因此,在不同的场景下,我们应该根据自己的需要选择不同的树结构。
最后给大家看总结二叉树、二叉搜索树、二叉排序树、二叉平衡树的区别,方便大家总结学习:
●二叉树是一种树状数据结构,每个节点最多有两个子节点。其中,根节点无父节点,叶节点无子节点。二叉树可以是空树。
●二叉查找树(BST)它是满足以下条件的二叉树:
如果左子树不是空的,左子树上所有节点的值都小于其根节点的值
如果右子树不是空的,右子树上所有节点的值都大于其根节点的值
左右子树均为二叉寻找树
没有等于键值的节点
●二叉排序树(BST)和二叉找树(BST)它是一种满足二叉寻找树条件的二叉树。
●二叉平衡树(AVL)它是一种满足以下条件的自平衡二叉搜索树:
左右树的高度差不得超过1
左右子树均为二叉平衡树
综上所述,二叉树是一种树状数据结构,每个节点最多有两个子节点。二叉搜索树和二叉排序树是同一个概念,它们是满足特定条件的二叉树。二叉平衡树是一种自平衡的二叉搜索树,保证了树的高度平衡,防止树的过度失衡。