二叉树的基本操作(一)

简介: 二叉树的基本操作

二叉树的基本操作

  • 二叉树的遍历

​ 如果按照某种规则进行约定,则每个人对于同一棵树的遍历结果肯定是相同的。如果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;
    }
相关文章
|
10月前
|
存储 算法
链式二叉树的基本操作实现(建议收藏!!!)(2)
链式二叉树的基本操作实现(建议收藏!!!)
90 0
|
11月前
|
存储 算法
二叉树基本操作实现 && 树和二叉树&& 二叉树进阶oj && 堆的基本概念 && 优先级队列的使用_
二叉树基本操作实现 && 树和二叉树&& 二叉树进阶oj && 堆的基本概念 && 优先级队列的使用_
69 0
|
4月前
|
存储 算法
数据结构实验(四)二叉树的基本操作
数据结构实验(四)二叉树的基本操作
|
4月前
|
存储
二叉树的基本概念以及基本操作
二叉树的基本概念以及基本操作
41 2
|
10月前
链式二叉树的基本操作实现(建议收藏!!!)(3)
链式二叉树的基本操作实现(建议收藏!!!)
35 0
|
10月前
链式二叉树的基本操作实现(建议收藏!!!)(1)
链式二叉树的基本操作实现(建议收藏!!!)
49 0
|
存储 机器学习/深度学习 Java
数据结构(4)树形结构——二叉树(概述、前序、中序、后序、层序遍历JAVA实现)
4.1.树 树,由n(n≥0)个有限节点和边组成一个具有层次关系的数据结构。树需要满足以下条件: 任何结点的子节点不相交。 任何子结点只有一个父节点。 N个结点,N-1条边。 对于一个非空树(结点数≥0),具有以下性质: 起始结点称为“根” 除根结点外可分为m个互不相交的有限集合,其中每个集合本身也是一棵树,称为原来这棵树的“子树”。
127 0
《Java数据结构》二叉树的这些基本操作你真的理解了吗
《Java数据结构》二叉树的这些基本操作你真的理解了吗
【Java数据结构】实现二叉树及其基本操作
【Java数据结构】实现二叉树及其基本操作
【Java数据结构】实现二叉树及其基本操作