欢迎访问宙启技术站
智能推送

Java函数:如何实现二叉树的查找与遍历?

发布时间:2023-06-18 10:37:43

一、二叉树简介

从结构上看,二叉树是由结点构成的集合,并且每个结点最多只有两个子结点(左子结点和右子结点)。有左右之分,且左子树和右子树本身又是一棵二叉树。从这个概念上,体现了二叉树的递归性质。

在二叉树的遍历中,主要有前序遍历、中序遍历和后序遍历三种情况。

二、二叉树的存储方式

1.顺序存储方式:将树的每个结点依次存储在一块连续的存储区域中。但是,对于这种存储方式,空间利用率非常低,因为大部分元素都是空结点;另外,我们对树进行操作时,可能需要移动大量元素,增加了复杂度和开销。

2.链式存储方式:通过指针连接每个结点。也就是说,对于每个结点,存储了指向左子结点和右子结点的指针,又称为动态存储方式。

最常见的链式存储方式包括:(1)使用结构体嵌套的方式,统一定义二叉树结构体;(2)使用“指针数组+malloc”的方式,动态生成二叉树结点。

三、Java实现二叉树

1.二叉树结点的定义和二叉树的创建

二叉树结点定义,代码如下:

public class TreeNode {

int val;

TreeNode left;

TreeNode right;

TreeNode(int x) { val = x; }

}

二叉树的创建包括两个操作:初始化空的二叉树和向二叉树中添加结点。

初始化二叉树:

public class BinaryTree {

public TreeNode createBinaryTree(int[] array, int index) {

TreeNode treeNode = null;

if (index < array.length) {

int value = array[index];

treeNode = new TreeNode(value);

treeNode.left = createBinaryTree(array, 2 * index + 1);

treeNode.right = createBinaryTree(array, 2 * index + 2);

}

return treeNode;

}

}

向二叉树中添加结点:

public TreeNode addTreeNode(TreeNode root, int value) {

if (root == null) {

root = new TreeNode(value);

return root;

}

if (value < root.val) {

root.left = addTreeNode(root.left, value);

} else {

root.right = addTreeNode(root.right, value);

}

return root;

}

2.二叉树的遍历

前序遍历(根->左->右):

public void preOrderTraversal(TreeNode node) {

if (node != null) {

System.out.print(node.val + " ");

preOrderTraversal(node.left);

preOrderTraversal(node.right);

}

}

中序遍历(左->根->右):

public void inOrderTraversal(TreeNode node) {

if (node != null) {

inOrderTraversal(node.left);

System.out.print(node.val + " ");

inOrderTraversal(node.right);

}

}

后序遍历(左->右->根):

public void postOrderTraversal(TreeNode node) {

if (node != null) {

postOrderTraversal(node.left);

postOrderTraversal(node.right);

System.out.print(node.val + " ");

}

}

3.二叉树的查找

在二叉树中查找一个给定的结点:

public TreeNode search(TreeNode root, int value) {

if (root == null || root.val == value) {

return root;

}

if (value < root.val) {

return search(root.left, value);

} else {

return search(root.right, value);

}

}

查找二叉树中的最小值:

public TreeNode findMin(TreeNode root) {

while (root.left != null) {

root = root.left;

}

return root;

}

查找二叉树中的最大值:

public TreeNode findMax(TreeNode root) {

while (root.right != null) {

root = root.right;

}

return root;

}

四、使用案例

1.创建二叉树并添加结点

public static void main(String[] args) {

BinaryTree binaryTree = new BinaryTree();

int[] array = new int[]{12, 23, 45, 43, 5, 7, 87, 34, 8, 90};

TreeNode root = binaryTree.createBinaryTree(array, 0);

binaryTree.addTreeNode(root, 15);

}

2.遍历二叉树

public static void main(String[] args) {

BinaryTree binaryTree = new BinaryTree();

int[] array = new int[]{12, 23, 45, 43, 5, 7, 87, 34, 8, 90};

TreeNode root = binaryTree.createBinaryTree(array, 0);

System.out.println("前序遍历:");

binaryTree.preOrderTraversal(root);

System.out.println();

System.out.println("中序遍历:");

binaryTree.inOrderTraversal(root);

System.out.println();

System.out.println("后序遍历:");

binaryTree.postOrderTraversal(root);

}

3.查找二叉树中的结点

public static void main(String[] args) {

BinaryTree binaryTree = new BinaryTree();

int[] array = new int[]{12, 23, 45, 43, 5, 7, 87, 34, 8, 90};

TreeNode root = binaryTree.createBinaryTree(array, 0);

System.out.println("树中是否存在节点 34 :" + binaryTree.search(root, 34));

System.out.println("树中最小值:" + binaryTree.findMin(root).val);

System.out.println("树中最大值:" + binaryTree.findMax(root).val);

}

五、总结

本文主要介绍了二叉树的基本概念和实现方式,同时给出了二叉树的创建和遍历、查找等操作的Java实现。对于需要用到二叉树的情况,读者可以根据自己的实际需要,选择最合适的实现方式。当然,本文介绍的只是二叉树的基本操作,对于复杂的算法和应用场景,读者可以进一步深入研究。