【数据结构】树

举报
一颗小谷粒 发表于 2024/10/29 21:13:41 2024/10/29
【摘要】 一、树的定义树是一种非线性的数据结构,由节点和边组成。树中的每个节点都可以有零个或多个子节点,但每个节点只有一个父节点(除了根节点,根节点没有父节点)。树具有层次结构,从根节点开始,每个节点可以有多个子节点,形成一个层次分明的结构。二、树的基本概念节点(Node):树中的基本元素,包含数据和指向子节点的指针。根节点(Root):树中唯一没有父节点的节点。父节点(Parent):如果一个节点有...
一、树的定义


树是一种非线性的数据结构,由节点和边组成。树中的每个节点都可以有零个或多个子节点,但每个节点只有一个父节点(除了根节点,根节点没有父节点)。树具有层次结构,从根节点开始,每个节点可以有多个子节点,形成一个层次分明的结构。


二、树的基本概念


  1. 节点(Node):树中的基本元素,包含数据和指向子节点的指针。
  2. 根节点(Root):树中唯一没有父节点的节点。
  3. 父节点(Parent):如果一个节点有子节点,那么这个节点就是它的子节点的父节点。
  4. 子节点(Child):一个节点的直接后代节点。
  5. 叶节点(Leaf):没有子节点的节点。
  6. 边(Edge):连接两个节点的线,表示它们之间的关系。
  7. 路径(Path):从一个节点到另一个节点的连续节点序列。
  8. 深度(Depth):从根节点到某个节点的路径长度。
  9. 高度(Height):从某个节点到叶节点的最长路径长度。


三、树的常见类型


  1. 二叉树(Binary Tree):每个节点最多有两个子节点的树。
  2. 二叉搜索树(Binary Search Tree):二叉树的一种特殊形式,对于树中的每个节点,其左子树中的所有节点的值都小于该节点的值,右子树中的所有节点的值都大于该节点的值。
  3. 平衡二叉树(Balanced Binary Tree):一种特殊的二叉搜索树,它的左右子树的高度差不超过 1。
  4. 红黑树(Red-Black Tree):一种自平衡的二叉搜索树,通过颜色标记和旋转操作来保持平衡。
  5. 堆(Heap):一种特殊的完全二叉树,分为最大堆和最小堆。最大堆中每个节点的值都大于等于其子节点的值,最小堆中每个节点的值都小于等于其子节点的值。


四、树的遍历方式


  1. 前序遍历(Preorder Traversal):先访问根节点,然后遍历左子树,最后遍历右子树。
  2. 中序遍历(Inorder Traversal):先遍历左子树,然后访问根节点,最后遍历右子树。
  3. 后序遍历(Postorder Traversal):先遍历左子树,然后遍历右子树,最后访问根节点。
  4. 层序遍历(Level Order Traversal):从根节点开始,依次遍历每一层的节点。


五、代码实现


以下是用 Java 语言实现二叉树的代码示例,包括前序、中序、后序和层序遍历:
class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode(int val) {
        this.val = val;
    }
}

class BinaryTree {
    public void preorderTraversal(TreeNode root) {
        if (root == null) {
            return;
        }
        System.out.print(root.val + " ");
        preorderTraversal(root.left);
        preorderTraversal(root.right);
    }

    public void inorderTraversal(TreeNode root) {
        if (root == null) {
            return;
        }
        inorderTraversal(root.left);
        System.out.print(root.val + " ");
        inorderTraversal(root.right);
    }

    public void postorderTraversal(TreeNode root) {
        if (root == null) {
            return;
        }
        postorderTraversal(root.left);
        postorderTraversal(root.right);
        System.out.print(root.val + " ");
    }

    public void levelOrderTraversal(TreeNode root) {
        if (root == null) {
            return;
        }
        java.util.LinkedList<TreeNode> queue = new java.util.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);
            }
        }
    }
}

public class TreeExample {
    public static void main(String[] args) {
        TreeNode root = new TreeNode(1);
        root.left = new TreeNode(2);
        root.right = new TreeNode(3);
        root.left.left = new TreeNode(4);
        root.left.right = new TreeNode(5);

        BinaryTree binaryTree = new BinaryTree();
        System.out.print("前序遍历:");
        binaryTree.preorderTraversal(root);
        System.out.println();

        System.out.print("中序遍历:");
        binaryTree.inorderTraversal(root);
        System.out.println();

        System.out.print("后序遍历:");
        binaryTree.postorderTraversal(root);
        System.out.println();

        System.out.print("层序遍历:");
        binaryTree.levelOrderTraversal(root);
    }
}
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。