二分搜索树深度优先遍历学习笔记
什么是二分搜索树?
二分搜索树(Binary Search Tree,简称BST)是一种数据结构,它具有以下特点:
- 每个节点最多只有两个子节点;
- 二分搜索树的左子树都小于根节点,右子树都大于根节点;
- 每个节点都可以看做一颗新的二分搜索树。
例如,下图就是一颗二分搜索树:
Copy Code 5
/ \
3 6
/ \ \
2 4 8
/ \
7 9
深度优先遍历
深度优先遍历(Depth-First-Search,简称DFS)是一种遍历二叉树的方法。常用的有以下三种遍历方式:
- 前序遍历:先访问根节点,递归遍历左右子树;
- 中序遍历:先递归遍历左子树,访问根节点,再递归遍历右子树;
- 后序遍历:先递归遍历左右子树,访问根节点。
下面给出一个前序遍历的示例代码:
javaCopy Codepublic void preOrder(TreeNode root) {
if (root == null) {
return;
}
System.out.print(root.val + " ");
preOrder(root.left);
preOrder(root.right);
}
假设我们要遍历上述二分搜索树,其前序遍历结果为:5 3 2 4 6 8 7 9。
代码实例
下面给出一个使用Java实现的二分搜索树数据结构。代码中包含了前、中、后序遍历的实现。
javaCopy Codepublic class BST<E extends Comparable<E>> {
private Node root;
private class Node {
public E e;
public Node left, right;
public Node(E e) {
this.e = e;
left = null;
right = null;
}
}
public void add(E e) {
root = add(root, e);
}
private Node add(Node node, E e) {
if (node == null) {
return new Node(e);
}
if (e.compareTo(node.e) < 0) {
node.left = add(node.left, e);
} else if (e.compareTo(node.e) > 0) {
node.right = add(node.right, e);
}
return node;
}
public boolean contains(E e) {
return contains(root, e);
}
private boolean contains(Node node, E e) {
if (node == null) {
return false;
}
if (e.compareTo(node.e) == 0) {
return true;
} else if (e.compareTo(node.e) < 0) {
return contains(node.left, e);
} else {
return contains(node.right, e);
}
}
public void preOrder() {
preOrder(root);
}
private void preOrder(Node node) {
if (node == null) {
return;
}
System.out.print(node.e + " ");
preOrder(node.left);
preOrder(node.right);
}
public void inOrder() {
inOrder(root);
}
private void inOrder(Node node) {
if (node == null) {
return;
}
inOrder(node.left);
System.out.print(node.e + " ");
inOrder(node.right);
}
public void postOrder() {
postOrder(root);
}
private void postOrder(Node node) {
if (node == null) {
return;
}
postOrder(node.left);
postOrder(node.right);
System.out.print(node.e + " ");
}
}
使用示例:
javaCopy Codepublic static void main(String[] args) {
BST<Integer> bst = new BST<>();
bst.add(5);
bst.add(3);
bst.add(6);
bst.add(2);
bst.add(4);
bst.add(8);
bst.add(7);
bst.add(9);
bst.preOrder(); // 5 3 2 4 6 8 7 9
System.out.println();
bst.inOrder(); // 2 3 4 5 6 7 8 9
System.out.println();
bst.postOrder(); // 2 4 3 7 9 8 6 5
}
以上就是关于二分搜索树深度优先遍历的学习笔记。