顺序存储二叉树的遍历【Java实现】

1. 顺序存储二叉树的特点

特点:

  1. 通常只考虑完全二叉树1
  2. 数组中索引为 index 的元素,其左子节点的索引为 2 * index + 1
  3. 数组中索引为 index 的元素,其左子节点的索引为 2 * index + 2
  4. 数组中索引为 index 的元素,其父节点的索引为 ( index - 1) / 2

图示:

2. 先序遍历

按照二叉树的先序遍历规则遍历数组

代码如下:

public class ArrBinaryTreeDemo {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5, 6, 7};
        ArrBinaryTree arrBinaryTree = new ArrBinaryTree(arr);
        arrBinaryTree.preOrder();
    }
}

class ArrBinaryTree {
    //存储数据节点的数组
    private int[] arr;

    public ArrBinaryTree(int[] arr) {
        this.arr = arr;
    }

    /**
     * 重载方法,方便传参
     */
    public void preOrder() {
        this.preOrder(0);
    }

    /**
     * 顺序存储二叉树的先序遍历
     *
     * @param index 数组索引
     */
    public void preOrder(int index) {
        //如果数组为空,则打印提示信息并结束方法
        if (arr == null || arr.length == 0) {
            System.out.println("数组为空,无法进行先序遍历!");
            return;
        }
        //输出当前节点的数据
        System.out.print(arr[index] + "\t");
        //递归遍历当前节点的左子树
        if ((2 * index + 1) < arr.length) {
            preOrder(2 * index + 1);
        }
        //递归遍历当前节点的右子树
        if ((2 * index + 1) < arr.length) {
            preOrder(2 * index + 2);
        }
    }
}

测试结果:

1	2	4	5	3	6	7	

3. 中序遍历

按照二叉树的中序遍历规则遍历数组

代码如下:

public class ArrBinaryTreeDemo {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5, 6, 7};
        ArrBinaryTree arrBinaryTree = new ArrBinaryTree(arr);
        arrBinaryTree.midOrder();
    }
}

class ArrBinaryTree {
    //存储数据节点的数组
    private int[] arr;

    public ArrBinaryTree(int[] arr) {
        this.arr = arr;
    }

    /**
     * 重载方法,方便传参
     */
    public void midOrder() {
        this.midOrder(0);
    }

    /**
     * 顺序存储二叉树的中序遍历
     *
     * @param index 数组索引
     */
    public void midOrder(int index) {
        //如果数组为空,则打印提示信息并结束方法
        if (arr == null || arr.length == 0) {
            System.out.println("数组为空,无法进行先序遍历!");
            return;
        }
        //递归遍历当前节点的左子树
        if ((2 * index + 1) < arr.length) {
            midOrder(2 * index + 1);
        }
        //输出当前节点的数据
        System.out.print(arr[index] + "\t");
        //递归遍历当前节点的右子树
        if ((2 * index + 1) < arr.length) {
           midOrder(2 * index + 2);
        }
    }
}

测试结果:

4	2	5	1	6	3	7

4. 后序遍历

按照二叉树的后序遍历规则遍历数组

代码如下:

public class ArrBinaryTreeDemo {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5, 6, 7};
        ArrBinaryTree arrBinaryTree = new ArrBinaryTree(arr);
        arrBinaryTree.postOrder();
    }
}

class ArrBinaryTree {
    //存储数据节点的数组
    private int[] arr;

    public ArrBinaryTree(int[] arr) {
        this.arr = arr;
    }

    /**
     * 重载方法,方便传参
     */
    public void postOrder() {
        this.postOrder(0);
    }

    /**
     * 顺序存储二叉树的后序遍历
     *
     * @param index 数组索引
     */
    public void postOrder(int index) {
        //如果数组为空,则打印提示信息并结束方法
        if (arr == null || arr.length == 0) {
            System.out.println("数组为空,无法进行先序遍历!");
            return;
        }
        //递归遍历当前节点的左子树
        if ((2 * index + 1) < arr.length) {
            postOrder(2 * index + 1);
        }
        //递归遍历当前节点的右子树
        if ((2 * index + 1) < arr.length) {
            postOrder(2 * index + 2);
        }
        //输出当前节点的数据
        System.out.print(arr[index] + "\t");
    }
}

测试结果:

4	5	2	6	7	3	1

  1. 一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。 ↩︎

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: // Definition for a binary tree node. // public class TreeNode { // int val; // TreeNode left; // TreeNode right; // TreeNode() {} // TreeNode(int val) { this.val = val; } // TreeNode(int val, TreeNode left, TreeNode right) { // this.val = val; // this.left = left; // this.right = right; // } // } class Solution { public List<List<Integer>> levelOrder(TreeNode root) { List<List<Integer>> res = new ArrayList<>(); if (root == null) return res; Queue<TreeNode> queue = new LinkedList<>(); queue.offer(root); // 将根节点加入队列 while (!queue.isEmpty()) { int levelSize = queue.size(); // 获取当前层的节点数 List<Integer> currLevel = new ArrayList<>(); // 当前层的节点值列表 for (int i = 0; i < levelSize; i++) { TreeNode node = queue.poll(); currLevel.add(node.val); // 将节点值加入列表 if (node.left != null) queue.offer(node.left); // 将左子节点加入队列 if (node.right != null) queue.offer(node.right); // 将右子节点加入队列 } res.add(currLevel); // 将当前层的节点值列表加入结果列表 } return res; } } ### 回答2: 二叉树的层次遍历是一种广度优先搜索(BFS)的算法。这种算法从根节点开始逐层遍历,并按照从上到下、从左到右的顺序访问每个节点。 在Java中,我们可以使用队列来实现二叉树的层次遍历。 首先,我们需要定义一个辅助队列来存储待遍历的节点。开始时,将根节点入队。 接下来,我们使用一个循环来迭代访问队列中的节点,直到队列为空。在每一轮迭代中,我们取出队列的头部节点,将其值存储起来,并访问其左右子节点(如果存在),然后将子节点依次入队。 具体的代码实现如下: ```java public void levelOrderTraversal(TreeNode root) { if (root == null) { return; } Queue<TreeNode> queue = new LinkedList<>(); queue.offer(root); while (!queue.isEmpty()) { TreeNode node = queue.poll(); System.out.print(node.val + " "); if (node.left != null) { queue.offer(node.left); } if (node.right != null) { queue.offer(node.right); } } } ``` 以上代码中,先判断根节点是否为空,若为空则直接返回。然后定义一个队列queue,并将根节点入队。 接下来,进入while循环,判断队列是否为空。若不为空,则将队列的头部节点出队,并打印其值。 然后,判断当前节点的左右子节点,若存在则将它们依次入队。 最终,当队列为空时,表示层次遍历已经完成。 通过以上步骤,就可以实现二叉树的层次遍历。 ### 回答3: 二叉树的层次遍历是通过逐层遍历二叉树节点的算法。在层次遍历中,我们从根节点开始,逐层遍历直到叶子节点。层次遍历顺序是从左到右,一层一层地进行。 在Java中,我们可以使用队列来实现二叉树的层次遍历。首先,我们将根节点入队列,然后进入循环。在循环中,我们取出队列中的一个节点,并进行相应的处理,比如输出节点的值。接下来,将该节点的左孩子和右孩子分别入队列。然后继续循环,直到队列为空。 下面是一个示例代码: ```java public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int val) { this.val = val; } } public void levelOrderTraversal(TreeNode root) { if (root == null) { return; } Queue<TreeNode> queue = new LinkedList<>(); queue.add(root); while (!queue.isEmpty()) { TreeNode node = queue.poll(); System.out.print(node.val + " "); if (node.left != null) { queue.add(node.left); } if (node.right != null) { queue.add(node.right); } } } ``` 以上是二叉树层次遍历Java实现。我们使用队列来保存待遍历的节点,每次从队列中取出一个节点并输出其值,然后将其左孩子和右孩子入队列。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值