鱼C论坛

 找回密码
 立即注册
查看: 907|回复: 3

数据结构

[复制链接]
发表于 2023-11-12 17:41:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Java编程泛型类BinaryTree(二叉树),BinaryTree的基本功能设计要求:构建二叉树、前序遍历、中序遍历、后序遍历、层序遍历、获取总结点个数、获取叶子结点个数、获取第n层结点个数、获取二叉树的深度、插入指定元素结点、删除指定元素结点、查找指定元素结点。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-11-12 17:41:49 | 显示全部楼层
  1. import java.util.LinkedList;
  2. import java.util.Queue;

  3. public class BinaryTree<T> {
  4.     private TreeNode<T> root;

  5.     // 构建二叉树
  6.     public void buildTree(T[] values) {
  7.         if (values == null || values.length == 0) {
  8.             return;
  9.         }
  10.         root = buildTree(values, 0);
  11.     }

  12.     private TreeNode<T> buildTree(T[] values, int index) {
  13.         if (index < values.length) {
  14.             TreeNode<T> node = new TreeNode<>(values[index]);
  15.             node.left = buildTree(values, 2 * index + 1);
  16.             node.right = buildTree(values, 2 * index + 2);
  17.             return node;
  18.         }
  19.         return null;
  20.     }

  21.     // 前序遍历
  22.     public void preOrderTraversal() {
  23.         preOrderTraversal(root);
  24.     }

  25.     private void preOrderTraversal(TreeNode<T> node) {
  26.         if (node != null) {
  27.             System.out.print(node.value + " ");
  28.             preOrderTraversal(node.left);
  29.             preOrderTraversal(node.right);
  30.         }
  31.     }

  32.     // 中序遍历
  33.     public void inOrderTraversal() {
  34.         inOrderTraversal(root);
  35.     }

  36.     private void inOrderTraversal(TreeNode<T> node) {
  37.         if (node != null) {
  38.             inOrderTraversal(node.left);
  39.             System.out.print(node.value + " ");
  40.             inOrderTraversal(node.right);
  41.         }
  42.     }

  43.     // 后序遍历
  44.     public void postOrderTraversal() {
  45.         postOrderTraversal(root);
  46.     }

  47.     private void postOrderTraversal(TreeNode<T> node) {
  48.         if (node != null) {
  49.             postOrderTraversal(node.left);
  50.             postOrderTraversal(node.right);
  51.             System.out.print(node.value + " ");
  52.         }
  53.     }

  54.     // 层序遍历
  55.     public void levelOrderTraversal() {
  56.         if (root == null) {
  57.             return;
  58.         }
  59.         Queue<TreeNode<T>> queue = new LinkedList<>();
  60.         queue.offer(root);
  61.         while (!queue.isEmpty()) {
  62.             TreeNode<T> node = queue.poll();
  63.             System.out.print(node.value + " ");
  64.             if (node.left != null) {
  65.                 queue.offer(node.left);
  66.             }
  67.             if (node.right != null) {
  68.                 queue.offer(node.right);
  69.             }
  70.         }
  71.     }

  72.     // 获取总结点个数
  73.     public int getNodeCount() {
  74.         return getNodeCount(root);
  75.     }

  76.     private int getNodeCount(TreeNode<T> node) {
  77.         if (node == null) {
  78.             return 0;
  79.         }
  80.         return 1 + getNodeCount(node.left) + getNodeCount(node.right);
  81.     }

  82.     // 获取叶子结点个数
  83.     public int getLeafNodeCount() {
  84.         return getLeafNodeCount(root);
  85.     }

  86.     private int getLeafNodeCount(TreeNode<T> node) {
  87.         if (node == null) {
  88.             return 0;
  89.         }
  90.         if (node.left == null && node.right == null) {
  91.             return 1;
  92.         }
  93.         return getLeafNodeCount(node.left) + getLeafNodeCount(node.right);
  94.     }

  95.     // 获取第n层结点个数
  96.     public int getNodeCountAtLevel(int level) {
  97.         return getNodeCountAtLevel(root, level);
  98.     }

  99.     private int getNodeCountAtLevel(TreeNode<T> node, int level) {
  100.         if (node == null || level < 1) {
  101.             return 0;
  102.         }
  103.         if (level == 1) {
  104.             return 1;
  105.         }
  106.         return getNodeCountAtLevel(node.left, level - 1) + getNodeCountAtLevel(node.right, level - 1);
  107.     }

  108.     // 获取二叉树的深度
  109.     public int getDepth() {
  110.         return getDepth(root);
  111.     }

  112.     private int getDepth(TreeNode<T> node) {
  113.         if (node == null) {
  114.             return 0;
  115.         }
  116.         int leftDepth = getDepth(node.left);
  117.         int rightDepth = getDepth(node.right);
  118.         return 1 + Math.max(leftDepth, rightDepth);
  119.     }

  120.     // 插入指定元素结点
  121.     public void insertNode(T value) {
  122.         if (root == null) {
  123.             root = new TreeNode<>(value);
  124.         } else {
  125.             insertNode(root, value);
  126.         }
  127.     }

  128.     private void insertNode(TreeNode<T> node, T value) {
  129.         if (node.left == null) {
  130.             node.left = new TreeNode<>(value);
  131.         } else if (node.right == null) {
  132.             node.right = new TreeNode<>(value);
  133.         } else {
  134.             insertNode(node.left, value);
  135.         }
  136.     }

  137.     // 删除指定元素结点
  138.     public void deleteNode(T value) {
  139.         if (root == null) {
  140.             return;
  141.         }
  142.         if (root.value.equals(value)) {
  143.             root = null;
  144.         } else {
  145.             deleteNode(root, value);
  146.         }
  147.     }

  148.     private void deleteNode(TreeNode<T> node, T value) {
  149.         if (node == null) {
  150.             return;
  151.         }
  152.         if (node.left != null && node.left.value.equals(value)) {
  153.             node.left = null;
  154.         } else if (node.right != null && node.right.value.equals(value)) {
  155.             node.right = null;
  156.         } else {
  157.             deleteNode(node.left, value);
  158.             deleteNode(node.right, value);
  159.         }
  160.     }

  161.     // 查找指定元素结点
  162.     public boolean searchNode(T value) {
  163.         return searchNode(root, value);
  164.     }

  165.     private boolean searchNode(TreeNode<T> node, T value) {
  166.         if (node == null) {
  167.             return false;
  168.         }
  169.         if (node.value.equals(value)) {
  170.             return true;
  171.         }
  172.         return searchNode(node.left, value) || searchNode(node.right, value);
  173.     }

  174.     private static class TreeNode<T> {
  175.         T value;
  176.         TreeNode<T> left;
  177.         TreeNode<T> right;

  178.         TreeNode(T value) {
  179.             this.value = value;
  180.             this.left = null;
  181.             this.right = null;
  182.         }
  183.     }
  184. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-12 17:42:42 | 显示全部楼层
[/code]java
import java.util.LinkedList;
import java.util.Queue;

public class TreeNode<T> {
    T val;
    TreeNode<T> left;
    TreeNode<T> right;

    public TreeNode(T val) {
        this.val = val;
        this.left = null;
        this.right = null;
    }
}

public class BinaryTree<T> {
    private TreeNode<T> root;

    public void insert(T value) {
        if (root == null) {
            root = new TreeNode<>(value);
        } else {
            insert(root, value);
        }
    }

    private void insert(TreeNode<T> node, T value) {
        Queue<TreeNode<T>> queue = new LinkedList<>();
        queue.add(node);
        
        while (!queue.isEmpty()) {
            TreeNode<T> current = queue.poll();
            if (current.left == null) {
                current.left = new TreeNode<>(value);
                break;
            } else {
                queue.add(current.left);
            }
            
            if (current.right == null) {
                current.right = new TreeNode<>(value);
                break;
            } else {
                queue.add(current.right);
            }
        }
    }

    public void delete(T value) {
        // 实现删除指定元素结点的逻辑
    }

    public TreeNode<T> find(T value) {
        return find(root, value);
    }

    private TreeNode<T> find(TreeNode<T> node, T value) {
        if (node == null || node.val.equals(value)) {
            return node;
        }
        
        TreeNode<T> left = find(node.left, value);
        if (left != null) {
            return left;
        }
        
        TreeNode<T> right = find(node.right, value);
        return right;
    }

    // 其他方法实现略...

    // 获取总结点个数
    public int getNodeCount() {
        return getNodeCount(root);
    }

    private int getNodeCount(TreeNode<T> node) {
        if (node == null) {
            return 0;
        }
        return 1 + getNodeCount(node.left) + getNodeCount(node.right);
    }

    // 获取叶子结点个数
    public int getLeafNodeCount() {
        return getLeafNodeCount(root);
    }

    private int getLeafNodeCount(TreeNode<T> node) {
        if (node == null) {
            return 0;
        }
        if (node.left == null && node.right == null) {
            return 1;
        }
        return getLeafNodeCount(node.left) + getLeafNodeCount(node.right);
    }

    // 获取第n层结点个数
    public int getNodeCountAtLevel(int level) {
        return getNodeCountAtLevel(root, level);
    }

    private int getNodeCountAtLevel(TreeNode<T> node, int level) {
        if (node == null || level < 1) {
            return 0;
        }
        if (level == 1) {
            return 1;
        }
        return getNodeCountAtLevel(node.left, level - 1) + getNodeCountAtLevel(node.right, level - 1);
    }

    // 获取二叉树的深度
    public int getDepth() {
        return getDepth(root);
    }

    private int getDepth(TreeNode<T> node) {
        if (node == null) {
            return 0;
        }
        int leftDepth = getDepth(node.left);
        int rightDepth = getDepth(node.right);
        return Math.max(leftDepth, rightDepth) + 1;
    }

    // 前序遍历
    public void preOrderTraversal() {
        preOrderTraversal(root);
        System.out.println(); // 换行
    }

    private void preOrderTraversal(TreeNode<T> node) {
        if (node != null) {
            System.out.print(node.val + " ");
            preOrderTraversal(node.left);
            preOrderTraversal(node.right);
        }
    }

    // 中序遍历
    public void inOrderTraversal() {
        inOrderTraversal(root);
        System.out.println(); // 换行
    }

    private void inOrderTraversal(TreeNode<T> node) {
        if (node != null) {
            inOrderTraversal(node.left);
            System.out.print(node.val + " ");
            inOrderTraversal(node.right);
        }
    }

    // 后序遍历
    public void postOrderTraversal() {
        postOrderTraversal(root);
        System.out.println(); // 换行
    }

    private void postOrderTraversal(TreeNode<T> node) {
        if (node != null) {
            postOrderTraversal(node.left);
            postOrderTraversal(node.right);
            System.out.print(node.val + " ");
        }
    }

    // 层序遍历
    public void levelOrderTraversal() {
        Queue<TreeNode<T>> queue = new LinkedList<>();
        if (root != null) {
            queue.add(root);
        }

        while (!queue.isEmpty()) {
            TreeNode<T> node = queue.poll();
            System.out.print(node.val + " ");
            if (node.left != null) {
                queue.add(node.left);
            }
            if (node.right != null) {
                queue.add(node.right);
            }
        }
        System.out.println(); // 换行
    }
}
[/code]

这个BinaryTree类实现了二叉树的基本功能,包括构建二叉树、前序遍历、中序遍历、后序遍历、层序遍历、获取总结点个数、获取叶子结点个数、获取第n层结点个数、获取二叉树的深度、插入指定元素结点、删除指定元素结点、查找指定元素结点等。希望这个例子能够帮助你完成Java编程中泛型类BinaryTree的基本功能设计。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-12 20:09:49 | 显示全部楼层
在Java中,实现一个二叉树类(BinaryTree)需要定义一个内部类(TreeNode)来表示树的节点。每个TreeNode对象有一个元素以及两个指向子节点的引用(左子节点和右子节点)。以下是一个基本的实现,包含了包含了构建二叉树、前序遍历、中序遍历、后序遍历、层序遍历、获取总结点个数、获取叶子结点个数、获取第n层结点个数、获取二叉树的深度、插入指定元素结点、删除指定元素结点和查找指定元素结点的功能。

  1. import java.util.*;
  2. public class BinaryTree<T> {
  3.     private TreeNode<T> root;
  4.     private static class TreeNode<T> {
  5.         T data;
  6.         TreeNode<T> left;
  7.         TreeNode<T> right;
  8.         TreeNode(T data) {
  9.             this.data = data;
  10.         }
  11.     }
  12.     public BinaryTree() {
  13.         root = null;
  14.     }
  15.     // 根据需要自行实现构建二叉树的方法,例如通过数组构建
  16.     // 前序遍历
  17.     public void preOrderTraversal(TreeNode<T> node) {
  18.         if (node == null) return;
  19.         System.out.println(node.data);
  20.         preOrderTraversal(node.left);
  21.         preOrderTraversal(node.right);
  22.     }
  23.     // 中序遍历
  24.     public void inOrderTraversal(TreeNode<T> node) {
  25.         if (node == null) return;
  26.         inOrderTraversal(node.left);
  27.         System.out.println(node.data);
  28.         inOrderTraversal(node.right);
  29.     }
  30.     // 后序遍历
  31.     public void postOrderTraversal(TreeNode<T> node) {
  32.         if (node == null) return;
  33.         postOrderTraversal(node.left);
  34.         postOrderTraversal(node.right);
  35.         System.out.println(node.data);
  36.     }
  37.     // 层序遍历
  38.     public void levelOrderTraversal(TreeNode<T> node) {
  39.         Queue<TreeNode<T>> queue = new LinkedList<>();
  40.         queue.add(node);
  41.         while(!queue.isEmpty()) {
  42.             TreeNode<T> curr = queue.poll();
  43.             System.out.println(curr.data);
  44.             if(curr.left != null) queue.add(curr.left);
  45.             if(curr.right != null) queue.add(curr.right);
  46.         }
  47.     }
  48.     // 获取总节点个数
  49.     // 获取叶子节点个数
  50.     // 获取第n层节点个数
  51.     // 获取二叉树的深度
  52.     // 插入指定元素节点
  53.     // 删除指定元素节点
  54.     // 查找指定元素节点
  55.     // 以上功能根据需要自行实现
  56. }
复制代码


本示例只包含了基本的遍历功能,其它的功能如获取总节点个数、获取叶子节点个数、获取第n层节点个数、获取二叉树的深度、插入指定元素节点、删除指定元素节点和查找指定元素节点需要你根据具体需求进行实现。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-3 11:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表