数据结构 —— 树4种遍历,java代码实现

文章目录

1、树的遍历分类

树的遍历分为两类:

  • 深度优先(DFS)
    • 前序遍历
    • 中序遍历
    • 后序遍历
  • 广度优先(BFS)
    • 层次遍历

2、树的遍历

2.1、定义节点

public class TreeNode {

    String value = null; // 根节点
    TreeNode leftChildren = null; // 左子节点
    TreeNode rightChildren = null; // 右子节点

    public TreeNode(String value, TreeNode leftChildren, TreeNode rightChildren) {
        this.value = value;
        this.leftChildren = leftChildren;
        this.rightChildren = rightChildren;
    }

    public TreeNode(String value) {
        this.value = value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public void setLeftChildren(TreeNode leftChildren) {
        this.leftChildren = leftChildren;
    }

    public void setRightChildren(TreeNode rightChildren) {
        this.rightChildren = rightChildren;
    }

    public String getValue() {
        return value;
    }

    public TreeNode getLeftChildren() {
        return leftChildren;
    }

    public TreeNode getRightChildren() {
        return rightChildren;
    }
}

3、深度优先(DFS)

3.1、前序遍历

思路:先根节点->左子树->右子树;

二叉树如下图:

在这里插入图片描述


public class TreeSearch {
	
    public TreeNode getTargetTree() {
        // 叶子节点
        TreeNode G = new TreeNode("G");
        TreeNode D = new TreeNode("D");
        TreeNode E = new TreeNode("E", G, null);
        TreeNode B = new TreeNode("B", D, E);
        TreeNode H = new TreeNode("H");
        TreeNode I = new TreeNode("I");
        TreeNode F = new TreeNode("F", H, I);
        TreeNode C = new TreeNode("C", null, F);
        // 构造根节点
        TreeNode root = new TreeNode("A", B, C);
        return root;
    }

    /**
     * 前序遍历 先根节点->左子树->右子树;
     */
    public void preOrderVisitTreeNode(TreeNode node) {
        if (null != node) {

            System.out.print(node.value);

            if (null != node.getLeftChildren()) {
                preOrderVisitTreeNode(node.getLeftChildren());
            }
            if (null != node.getRightChildren()) {
                preOrderVisitTreeNode(node.getRightChildren());
            }
        }
    }


    public static void main(String[] args) {

        TreeTest treeSearch = new TreeTest();
        TreeNode tree = treeSearch.getTargetTree();

        System.out.print("前序遍历:");
        treeSearch.preOrderVisitTreeNode(tree);
        System.out.println("");	
	}
}

运行结果:

先序遍历:ABDEGCFHI

3.2、中序遍历

思路:先左子树->根节点->右子树;

在这里插入图片描述

    /**
     *  中序遍历 先左子树->根节点->右子树;
     */
    public void inorderVisitTreeNode(TreeNode node) {
        if (null != node) {
            if (null != node.getLeftChildren()) {
                inorderVisitTreeNode(node.getLeftChildren());
            }

            System.out.print(node.value);

            if (null != node.getRightChildren()) {
                inorderVisitTreeNode(node.getRightChildren());
            }
        }
    }

    public static void main(String[] args) {
        TreeTest treeSearch = new TreeTest();
        TreeNode tree = treeSearch.getTargetTree();

        System.out.print("中序遍历:");
        treeSearch.inorderVisitTreeNode(tree);
        System.out.println("");
    }

运行结果:

中序遍历:DBGEACHFI
  • 1

3.3、后序遍历

思路:先左子树->右子树->根节点;

在这里插入图片描述

    /**
     *  后序遍历 先左子树->右子树->根节点;
     */
    public void postOrderVisitTreeNode(TreeNode node) {
        if (null != node) {
            if (null != node.getLeftChildren()) {
                postOrderVisitTreeNode(node.getLeftChildren());
            }
            if (null != node.getRightChildren()) {
                postOrderVisitTreeNode(node.getRightChildren());
            }

            System.out.print(node.value);
        }
    }

    public static void main(String[] args) {
       TreeTest treeSearch = new TreeTest();
       TreeNode tree= treeSearch.getTargetTree();
       
        System.out.print("后序遍历:");
        treeSearch.postOrderVisitTreeNode(tree);
        System.out.println("");
    }

运行结果:

后序遍历:DGEBHIFCA
  • 1

4、广度优先(BFS)

4.1、层次遍历

思路:先根节点,然后第二层,第三层,依次往下走,(同层节点从左往右输出);

在这里插入图片描述

运行结果:

层序遍历:ABCDEFGHI

层序遍历二叉树,是非递归的队列实现的,就是利用队列的先进先出(FIFO)实现的。

5、完整代码:

public class TreeNode {

    String value = null; // 根节点
    TreeNode leftChildren = null; // 左子节点
    TreeNode rightChildren = null; // 右子节点

    public TreeNode(String value, TreeNode leftChildren, TreeNode rightChildren) {
        this.value = value;
        this.leftChildren = leftChildren;
        this.rightChildren = rightChildren;
    }

    public TreeNode(String value) {
        this.value = value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public void setLeftChildren(TreeNode leftChildren) {
        this.leftChildren = leftChildren;
    }

    public void setRightChildren(TreeNode rightChildren) {
        this.rightChildren = rightChildren;
    }

    public String getValue() {
        return value;
    }

    public TreeNode getLeftChildren() {
        return leftChildren;
    }

    public TreeNode getRightChildren() {
        return rightChildren;
    }
}
public class TreeTest {

    public TreeNode getTargetTree() {
        // 叶子节点
        TreeNode G = new TreeNode("G");
        TreeNode D = new TreeNode("D");
        TreeNode E = new TreeNode("E", G, null);
        TreeNode B = new TreeNode("B", D, E);
        TreeNode H = new TreeNode("H");
        TreeNode I = new TreeNode("I");
        TreeNode F = new TreeNode("F", H, I);
        TreeNode C = new TreeNode("C", null, F);
        // 构造根节点
        TreeNode root = new TreeNode("A", B, C);
        return root;
    }

    /**
     * 前序遍历 先根节点->左子树->右子树;
     */
    public void preOrderVisitTreeNode(TreeNode node) {
        if (null != node) {

            System.out.print(node.value);

            if (null != node.getLeftChildren()) {
                preOrderVisitTreeNode(node.getLeftChildren());
            }
            if (null != node.getRightChildren()) {
                preOrderVisitTreeNode(node.getRightChildren());
            }
        }
    }

    /**
     *  中序遍历 先左子树->根节点->右子树;
     */
    public void inorderVisitTreeNode(TreeNode node) {
        if (null != node) {
            if (null != node.getLeftChildren()) {
                inorderVisitTreeNode(node.getLeftChildren());
            }

            System.out.print(node.value);

            if (null != node.getRightChildren()) {
                inorderVisitTreeNode(node.getRightChildren());
            }
        }
    }

    /**
     *  后序遍历 先左子树->右子树->根节点;
     */
    public void postOrderVisitTreeNode(TreeNode node) {
        if (null != node) {
            if (null != node.getLeftChildren()) {
                postOrderVisitTreeNode(node.getLeftChildren());
            }
            if (null != node.getRightChildren()) {
                postOrderVisitTreeNode(node.getRightChildren());
            }

            System.out.print(node.value);
        }
    }

    /**
     * 层次遍历
     */
    public void levelOrderVisitTreeNode(TreeNode node) {
        if (null != node) {
            LinkedList<TreeNode> list = new LinkedList<>();
            list.add(node);
            TreeNode currentNode;
            while (!list.isEmpty()) {

                currentNode = list.poll();

                System.out.print(currentNode.value);

                if (null != currentNode.getLeftChildren()) {
                    list.add(currentNode.getLeftChildren());
                }
                if (null != currentNode.getRightChildren()) {
                    list.add(currentNode.getRightChildren());
                }
            }
        }
    }

    public static void main(String[] args) {

        TreeTest treeSearch = new TreeTest();
        TreeNode tree = treeSearch.getTargetTree();

        System.out.print("前序遍历:");
        treeSearch.preOrderVisitTreeNode(tree);
        System.out.println("");

        System.out.print("中序遍历:");
        treeSearch.inorderVisitTreeNode(tree);
        System.out.println("");

        System.out.print("后序遍历:");
        treeSearch.postOrderVisitTreeNode(tree);
        System.out.println("");

        System.out.print("层次遍历:");
        treeSearch.levelOrderVisitTreeNode(tree);
    }
}

运行结果:

前序遍历:ABDEGCFHI
中序遍历:DBGEACHFI
后序遍历:DGEBHIFCA
层次遍历:ABCDEFGHI
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 什么是二叉? 二叉是一树形结构,其中每个节点最多有两个子节点。一个节点的左子节点比该节点小,右子节点比该节点大。二叉通常用于搜索和排序。 2. 二叉遍历方法有哪些? 二叉遍历方法包括前序遍历、中序遍历和后序遍历。前序遍历是从根节点开始遍历,先访问根节点,再访问左子,最后访问右子。中序遍历是从根节点开始遍历,先访问左子,再访问根节点,最后访问右子。后序遍历是从根节点开始遍历,先访问左子,再访问右子,最后访问根节点。 3. 二叉的查找方法有哪些? 二叉的查找方法包括递归查找和非递归查找。递归查找是从根节点开始查找,如果当前节点的值等于要查找的值,则返回当前节点。如果要查找的值比当前节点小,则继续在左子中查找;如果要查找的值比当前节点大,则继续在右子中查找。非递归查找可以使用栈或队列实现,从根节点开始,每次将当前节点的左右子节点入栈/队列,直到找到要查找的值或者栈/队列为空。 4. 二叉的插入与删除操作如何实现? 二叉的插入操作是将要插入的节点与当前节点的值进行比较,如果小于当前节点的值,则继续在左子中插入;如果大于当前节点的值,则继续在右子中插入。当找到一个空节点时,就将要插入的节点作为该空节点的子节点。删除操作需要分为三情况:删除叶子节点、删除只有一个子节点的节点和删除有两个子节点的节点。删除叶子节点很简单,只需要将其父节点的对应子节点置为空即可。删除只有一个子节点的节点,需要将其子节点替换为该节点的位置。删除有两个子节点的节点,则可以找到该节点的后继节点(即右子中最小的节点),将其替换为该节点,然后删除后继节点。 5. 什么是平衡二叉? 平衡二叉是一特殊的二叉,它保证左右子的高度差不超过1。这平衡可以确保二叉的查找、插入和删除操作的时间复杂度都是O(logn)。常见的平衡二叉包括红黑和AVL

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值