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

Java中实现二叉树的方法和遍历方式

发布时间:2023-06-21 11:16:45

一. 二叉树的实现

在Java中实现二叉树,可以通过定义一个节点类,用来存储节点的值、左子节点、右子节点的信息。例如,定义如下:

class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    public TreeNode(int val){
        this.val = val;
    }
}

接着,我们可以定义一个二叉树类,用来表示整个二叉树的根节点。

class BinaryTree {
    TreeNode root;
    public BinaryTree(TreeNode root){
        this.root = root;
    }
}

在实现二叉树时,我们通常需要考虑以下几个重要的操作:

1. 插入节点

在二叉树中插入一个节点,需要先找到它应该插入的位置。如果它的值小于当前节点的值,那么就需要往左子树中寻找插入位置,否则需要往右子树中寻找插入位置。

public TreeNode insert(TreeNode root, int val) {
    if (root == null) {
        return new TreeNode(val);
    }
    if (val < root.val) {
        root.left = insert(root.left, val);
    } else {
        root.right = insert(root.right, val);
    }
    return root;
}

2. 查找节点

在二叉树中查找一个节点,同样需要根据节点的值来进行查找。如果当前节点的值等于目标值,就返回该节点;如果目标值小于当前节点,就需要在左子树中查找;如果目标值大于当前节点,就需要在右子树中查找。

public TreeNode search(TreeNode root, int val) {
    if (root == null || root.val == val) {
        return root;
    }
    if (val < root.val) {
        return search(root.left, val);
    } else {
        return search(root.right, val);
    }
}

3. 删除节点

在二叉树中删除一个节点,需要先找到该节点。如果该节点是叶子节点,直接删除即可;如果该节点有一个子节点,就需要把子节点连接到该节点的父节点上;如果该节点有两个子节点,就需要找到它的后继节点(即右子树中的最小节点),把后继节点的值替换到要删除的节点上,再删除后继节点。

public TreeNode delete(TreeNode root, int val) {
    if (root == null) {
        return null;
    }
    if (val < root.val) {
        root.left = delete(root.left, val);
    } else if (val > root.val) {
        root.right = delete(root.right, val);
    } else {
        if (root.left == null) {
            return root.right;
        } else if (root.right == null) {
            return root.left;
        } else {
            TreeNode minNode = findMin(root.right);
            root.val = minNode.val;
            root.right = delete(root.right, minNode.val);
        }
    }
    return root;
}
//找到该节点右子树中的最小节点
public TreeNode findMin(TreeNode node) {
    while (node.left != null) {
        node = node.left;
    }
    return node;
}

4. 修改节点

在二叉树中修改一个节点的值,需要先找到该节点。如果找到了目标节点,就把它的值修改为新值即可。

public void modify(TreeNode root, int oldVal, int newVal) {
    TreeNode node = search(root, oldVal);
    if (node != null) {
        node.val = newVal;
    }
}

二、二叉树的遍历方式

在Java中实现二叉树时,我们通常需要考虑如何遍历二叉树。常用的二叉树遍历方式有前序遍历、中序遍历、后序遍历以及层次遍历等。

1. 前序遍历

前序遍历是指先访问根节点,然后递归地遍历左子树和右子树。在Java中可以通过递归实现前序遍历。

public void preOrder(TreeNode root) {
    if (root != null) {
        System.out.println(root.val);
        preOrder(root.left);
        preOrder(root.right);
    }
}

2. 中序遍历

中序遍历是指先递归地遍历左子树,然后访问根节点,最后再递归地遍历右子树。在Java中可以通过递归实现中序遍历。

public void inOrder(TreeNode root) {
    if (root != null) {
        inOrder(root.left);
        System.out.println(root.val);
        inOrder(root.right);
    }
}

3. 后序遍历

后序遍历是指先递归地遍历左子树和右子树,最后访问根节点。在Java中可以通过递归实现后序遍历。

public void postOrder(TreeNode root) {
    if (root != null) {
        postOrder(root.left);
        postOrder(root.right);
        System.out.println(root.val);
    }
}

4. 层次遍历

层次遍历是指从上到下逐层遍历二叉树。在Java中可以通过队列实现层次遍历。

public void levelOrder(TreeNode root) {
    if (root == null) {
        return;
    }
    Queue<TreeNode> queue = new LinkedList<>();
    queue.offer(root);
    while (!queue.isEmpty()) {
        TreeNode node = queue.poll();
        System.out.println(node.val);
        if (node.left != null) {
            queue.offer(node.left);
        }
        if (node.right != null) {
            queue.offer(node.right);
        }
    }
}

以上是我们常用的四种二叉树遍历方式。在实现二叉树时,我们可以根据实际情况,选用不同的遍历方式,以满足需要。