ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

二叉树java实现

2022-07-28 09:04:15  阅读:128  来源: 互联网

标签:Node java val 实现 System 二叉树 root public out


二叉树java实现

/**
 * 链表实现二叉树
 * -创建二叉树
 * -前序、中序、后序、层次遍历二叉树
 * -判断值是否存在
 * -二叉树高度
 */
public class BinaryTree {
    // 链表节点
    public static class Node {
        public String val;
        public Node left;
        public Node right;
        public Node() {
        }
        public Node(String val) {
            this.val = val;
        }
    }

    /**
     * 创建二叉树(需要辅助变量 i)
     * 通过前序字符串 String[] {"A", "B","#", "#", "C", "#", "#"} 来创建
     * 注意:必须是前序字符串
     * #表示空节点
     */
    private static int i = 0;

    // 利用前序字符串数组自动创建
    public static Node createBTree(String[] arr) {
        if ("#".equals(arr[i])) {
            i++;
            return null;
        }
        Node root = new Node(arr[i++]);
        root.left = createBTree(arr);
        root.right = createBTree(arr);
        return root;
    }

    // 手动创建(输入顺序必须是前序序列)
    public static Node handCreate() {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入节点元素:");
        String next = scanner.next();
        Node root = new Node(next);
        if ("#".equals(next)) return null;
        root.left = handCreate();
        root.right = handCreate();
        return root;
    }

    // 前序遍历
    public static void preOrder(Node root) {
        if (root == null) return;
        System.out.print(root.val + "\t");
        preOrder(root.left);
        preOrder(root.right);
    }

    // 中序遍历
    public static void inOrder(Node root) {
        if (root == null) return;
        inOrder(root.left);
        System.out.print(root.val + "\t");
        inOrder(root.right);
    }

    // 后序遍历
    public static void afterOrder(Node root) {
        if (root == null) return;
        afterOrder(root.left);
        afterOrder(root.right);
        System.out.print(root.val + "\t");
    }

    // 层次遍历
    public static void levelOrder(Node root) {
        Queue<Node> queue = new LinkedList<>();
        // 先将根节点入队
        queue.add(root);
        // 遍历,直到队列为空
        while (!queue.isEmpty()) {
            // 出队输出
            Node pollNode = queue.poll();
            System.out.print(pollNode.val + "\t");
            // 如果左子树不为空,入队
            if (pollNode.left != null) {
                queue.add(pollNode.left);
            }
            // 如果右子树不为空,入队
            if (pollNode.right != null) {
                queue.add(pollNode.right);
            }
        }
    }

    // 二叉树中是否存在指定值
    public static boolean isExist(Node root, String val) {
        if (root == null) return false;
        if (val.equals(root.val)) return true;
        boolean l = isExist(root.left, val);
        boolean r = isExist(root.right, val);
        return l || r;
    }

    // 二叉树高度
    public static int getHeight(Node root) {
        if (root == null) return 0;
        int lHeight = getHeight(root.left);
        int rHeight = getHeight(root.right);
        return Math.max(lHeight, rHeight) + 1;
    }

    // main
    public static void main(String[] args) {
        // 前序字符串数组
        String[] arr1 = {"A", "B", "D", "#", "#", "E", "#", "#", "C", "#", "#"};
        String[] arr2 = {"A", "B", "#", "#", "C", "#", "#"};
        Node root = BinaryTree.createBTree(arr2);
        System.out.println("前序遍历:");
        BinaryTree.preOrder(root);
        System.out.println();

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

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

        System.out.println("层次遍历:");
        BinaryTree.levelOrder(root);
        System.out.println();

        System.out.println("二叉树高度:" + BinaryTree.getHeight(root));
        System.out.println("是否存在:" + BinaryTree.isExist(root, "C"));
    }
}

标签:Node,java,val,实现,System,二叉树,root,public,out
来源: https://www.cnblogs.com/liqiju/p/16527248.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有