数据结构——二叉树

本文介绍了数据结构中的树,强调其非线性结构和树的特点,包括节点、度、叶子节点等概念。接着,文章详细阐述了二叉树的定义,指出二叉树所有节点的度不超过2。最后,讨论了二叉树的四种遍历方式:前序遍历、中序遍历、后序遍历和层序遍历,其中层序遍历借助队列实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据结构中的树和前面的线性表有所不同,它属于一种非线性的结构,由N个(N>=0)有限节点组成的具有层次关系的集合,这种结构看起来很像一棵倒挂着的树,也就是树根在上,树叶朝下,所以把它叫做树。
在这里插入图片描述
通过观察我们可以发现树这种结构具有以下几个特点:

  1. 每个节点有0个或多个子节点。
  2. 非根节点有且只有一个父节点。
  3. 没有父节点的节点叫做根节点
  4. 除了整棵树的根节点外,每个子节点又可以分为多个不相交的子树

树的一些概念:

  1. 一个节点含有的子树的个数就叫做节点的度,如上图A的度就为6
  2. 一棵树中,最大的节点的度叫做这整棵树的度,如上图这颗树的度就是6
  3. 度为0的节点叫做叶子节点,或者终端节点,也就是当前这个节点没有子树了,如上图的P,Q等
  4. 若一个节点含有子节点,则这个节点就叫做它的子节点的父节点或者双亲节点
  5. 一个节点含有的子树的根节点就叫做该节点的子节点或孩子节点
  6. 没有父节点的节点叫做根节点
  7. 从整棵树的根节点开始定义,根节点为第一次,根的子节点为第二层,以此类推。
  8. 树种节点的最大层次叫做树的高度。

树的表现形式:

class Node {
    int val;
    Node chid;
    Node brother;

其中,val表示当前节点的数据域,child表示当前节点的第一个孩子节点的地址,brother表示当前节点的兄弟节点的地址。

二叉树:

二叉树是一种特殊的树,它的度不能超过2,也就是说这棵树种所有节点的度都不能超过2.

在这里插入图片描述
二叉树的表现形式:

class Node {
    public int val;//当前节点的数据域
    public Node left;//当前节点的左孩子节点
    public Node right;//当前节点的右孩子节点
}

二叉树的遍历:
对于这种非线性的数据结构,遍历起来不能一次性直接从0到size(),采取递归进行遍历更为简便。二叉树的遍历方式细分下来有四种:
在这里插入图片描述

  1. 前序遍历:
    先访问整棵树的根节点,再递归遍历左子树,再递归遍历右子树。
 public static void prev(Node root){
        if(root==null){//代表这棵树是空树的时候,也可作为递归的终止条件,当遍历到最后一个叶子节点的时候
            return;
        }
        System.out.println(root.val);//打印当前根节点的数据域
        prev(root.left);//然后将当前节点的左子树的根节点又作为方法的参数调用自身
        prev(root.right);//再将当前节点的右子树的根节点作为方法的参数调用自身
    }
  1. 中序遍历
    先递归遍历左子树,再访问根节点,再递归遍历右子树
public static void prev(Node root){
        if(root==null){//代表这棵树是空树的时候,也可作为递归的终止条件,当遍历到最后一个叶子节点的时候
            return;
        }
        prev(root.left);//将当前节点的左子树的根节点作为方法的参数调用自身
        System.out.println(root.val);//打印当前根节点的数据域
        prev(root.right);//再将当前节点的右子树的根节点作为方法的参数调用自身
    }
  1. 后序遍历
    先递归遍历左子树,再递归遍历右子树,最后再访问根节点
public static void prev(Node root){
        if(root==null){//代表这棵树是空树的时候,也可作为递归的终止条件,当遍历到最后一个叶子节点的时候
            return;
        }
        prev(root.left);//将当前节点的左子树的根节点又作为方法的参数调用自身
        
        prev(root.right);//当前节点的右子树的根节点作为方法的参数调用自身
        System.out.println(root.val);//打印当前根节点的数据域
    }
  1. 层序遍历
    对于层序遍历并没有采用递归的方式,并且二叉树的表示法采用的是“孩子兄弟表示法”,借助队列来完成
public static void level(Node root){
        Queue<Node> queue = new LinkedList<>();//首先创建一个队列
        queue.offer(root);//先将整课树的根节点入队列
        while(!queue.isEmpty()){
            Node cur = queue.poll();
            System.out.println((cur.val));
            if(cur.left!=null){
                queue.offer(cur.left);//再将左右子树都入队列
            }
            if(cur.right!=null){
                queue.offer(cur.right);
            }
        }
    }
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值