二叉树的基本操作(一)

简介: 二叉树的基本操作

二叉树的基本操作

  • 二叉树的遍历

​ 如果按照某种规则进行约定,则每个人对于同一棵树的遍历结果肯定是相同的。如果N代表根节点,L代表根节点的左子树,R代表根节点的右子树,则根据遍历根节点的先后次序有以下遍历方式:

NLR:前序遍历(Preorder Traversal 亦称先序遍历)——访问根结点--->根的左子树--->根的右子树。
LNR:中序遍历(Inorder Traversal)——根的左子树--->根节点--->根的右子树。
LRN:后序遍历(Postorder Traversal)——根的左子树--->根的右子树--->根节点

层序遍历:从二叉树的根节点出发,首先访问第一层的节点,然后从左至右访问第二层的节点,从上至下,以此类推

image-20221009170141651

以上树为例,简单介绍二叉树的遍历实现:

  • 前序遍历

根节点-左子树-右子树

image-20221013104703755

前序遍历的结果为: A B D E H C F G

//前序遍历
   public void preOrder(TreeNode root){
        if(root == null){
            return;
        }
        System.out.println(root.val+" ");
        preOrder(root.left);
        preOrder(root.right);

   }
  • 中序遍历

左子树-根节点-右子树

image-20221013105700210

中序遍历的结果为: D B E  H A F C G 

// 中序遍历
    public void inOrder(TreeNode root){
        if(root == null){
            return;
        }
        inOrder(root.left);
        System.out.println(root.val+" ");
        inOrder(root.right);
    }
  • 后序遍历 

左子树-右子树-根节点

image-20221013110850329

 // 后序遍历
    public void postOrde(TreeNode root){
        if(root == null){
            return;
        }
        postOrde(root.left);
        postOrde(root.right);
        System.out.println(root.val+" ");
    }
  • 层序遍历

从根节点出发从左至右,以此类推

层序遍历结果: A  B  C  D  E  F  G  H

  • 使用List存储节点元素进行前序遍历
  public List<Character> preOrder2(TreeNode root){
        List<Character> ret = new ArrayList<>();
        if(root == null){
            return ret;
        }
        ret.add(root.val);
        List<Character> leftTree = preOrder2(root.left);
        ret.addAll(leftTree);
        List<Character> rightTree  = preOrder2(root.right);
        ret.addAll(rightTree);
        return ret;
    }
  • 获取树中节点的个数

获取树中节点的个数,我们可以采用遍历的方法实现,也可以采用子问题的思路,使用递归的方法,即左子树+右子树+根节点(+1)即可实现

size(root.left) +size(root.right)+1;
     /**
     *  遍历方法
     */
    public static int nodeSize = 0;
    public int size(TreeNode root){
        if(root == null){
            return 0;
        }
        nodeSize++;
        size(root.left);
        size(root.left);
        return nodeSize;
    }
    /**
     * 子树相加再加上根节点
     * @param root
     * @return
     */
    public int size2(TreeNode root){
        if(root == null){
            return 0;
        }
        int tmp = size(root.left) +size(root.right)+1;
        return tmp;
    }
  • 获取树中叶子节点的个数
获取树中叶子节点的个数,即左子树和右子树都为空时root.left==null&&root.right==null时,左子树上叶子节点+右子树上所有的叶子节点 或者使用临时变量leafSize++;
    /**
     * 获取叶子节点的个数
     * @param root
     * @return
     */
  //子问题思路
    public int getLeafNodeCount(TreeNode root){
        if(root == null){
            return  0;
        }
        if(root.left==null&&root.right==null){
            return 1;
        }
        int tmp = getLeafNodeCount(root.left)+getLeafNodeCount(root.right);
        return tmp;
    }
     //遍历方法
    public static int leafSize = 0;
    public  int getLeafNodeCount2(TreeNode root){
        if(root == null){
            return 0;
        }
        if(root.left == null&&root.right == null){
            leafSize++;
        }
        getLeafNodeCount2(root.left);
        getLeafNodeCount2(root.right);
        return leafSize;
    }
相关文章
|
2月前
|
安全 Linux 虚拟化
VMware Tools 12.5.4 下载 - 客户机操作系统无缝交互必备组件
VMware Tools 12.5.4 下载 - 客户机操作系统无缝交互必备组件
370 3
|
数据采集 数据挖掘 数据处理
Python爬虫开发:爬取简单的网页数据
本文详细介绍了如何使用Python爬取简单的网页数据,以掘金为例,展示了从发送HTTP请求、解析HTML文档到提取和保存数据的完整过程。通过这个示例,你可以掌握基本的网页爬取技巧,为后续的数据分析打下基础。希望本文对你有所帮助。
|
Web App开发 监控 网络协议
在Linux中,当用户反馈网站访问慢,如何处理?
在Linux中,当用户反馈网站访问慢,如何处理?
|
JavaScript 内存技术
nvm安装和切换node使用版本
nvm安装和切换node使用版本
|
机器学习/深度学习 人工智能 编解码
AI生成壁纸的工作原理
AI生成壁纸基于深度学习和生成对抗网络(GANs),通过生成器与判别器的对抗学习,以及条件生成对抗网络(CGANs)来创造特定风格的壁纸。技术还包括风格迁移、深度卷积生成对抗网络(DCGAN)、潜在空间扩展和自注意力机制。审美评价机制的引入确保了生成的壁纸既符合技术标准又有艺术价值。CGANs能根据用户条件生成个性化壁纸,而风格迁移技术通过多种方法实现图像风格转换。DCGAN和其他GAN变体在处理图像数据时有优势,如高质量样本生成和特征学习,但也存在图像质量、训练效率和模式崩溃等问题。通过构建审美评估模型和使用XAI技术,AI在生成壁纸时能更好地平衡技术与艺术标准。
|
存储 自然语言处理 NoSQL
知识图谱数据处理流程是什么
知识图谱是一种以实体、关系及其属性为基本单位,通过知识表示、存储和推理,对现实世界中的各种实体、属性进行关系抽取、语义匹配和知识推理的技术。知识图谱的数据处理流程主要包括数据获取与预处理、图谱构建、知识推理等几个步骤。
|
前端开发 架构师 Java
SpringBoot项目中WEB页面放哪里--【JSB系列之008】
SpringBoot项目中WEB页面放哪里--【JSB系列之008】
|
传感器 存储 数据采集
自动驾驶的“天眼”!聊一聊高精地图领域中所有主流的制作方案(上)
在过去几年中,自动驾驶一直是最受欢迎和最具挑战性的话题之一。在实现完全自主的道路上,研究人员利用了各种传感器,如激光雷达、相机、惯性测量单元(IMU)和GPS,并开发了用于自动驾驶应用的智能算法,如目标检测、目标分割、障碍避免和路径规划。近年来,高清晰度(HD)地图引起了广泛关注。
自动驾驶的“天眼”!聊一聊高精地图领域中所有主流的制作方案(上)
|
存储 小程序 搜索推荐
【微信小程序】小程序基本组成结构(下)
【微信小程序】小程序基本组成结构