首页 > 其他分享 >二叉树(上)

二叉树(上)

时间:2024-09-11 18:52:30浏览次数:3  
标签:遍历 TreeNode 二叉树 new root public

目录

树型结构

概念

二叉树

概念

二叉树的存储 

二叉树基本操作

基本变量

二叉树的遍历

完整代码


树型结构

概念

树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看 起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。

 树状图的形式如下图所示

二叉树

概念

一棵二叉树是结点点的一个优先集合,该集合有以下两种情况

  1. 为空
  2. 有一个根结点加上两棵分别称为左子树右子树的二叉树组成

 二叉树如图所示

特殊的二叉树 

满二叉树:二叉树的每层节点数都达到最大值,这棵树就是满二叉树。如果一颗二叉树的层数为k,且节点总数是2^k - 1,则它就是满二叉树。

完全二叉树:对于深度有k的,有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,当且仅当其每一个结点都与深度为K的满二叉树中编号从0至n-1的结点一一对应时称之为完全二叉树。满二叉树是一种特殊的完全二叉树。

二叉树的存储 

二叉树的存储结构分为:顺序存储类似于链表的链式存储

本文先介绍的是第二种: 类似于链表的链式存储。

二叉树的链式存储时通过一个一个结点引用起来的,常用的表达方式有二叉和三叉表达方式。

因为这里主要运用的是二叉表示法(下面称为孩子表示法),故先以这种方法为例。

//孩子表示法
class Node{
  Node root;   //根结点
  Node right;  //左孩子,常代表左孩子为根的整棵左子树
  Node left;   //右孩子,常代表右孩子为根的整棵右子树
  int val;     //数据域
 }

二叉树基本操作

为了减少二叉树的学习成本,我们可以先创建一棵简单的二叉树,以方便快速进入二叉树的操作学习。

基本变量

首先我们要创建关于二叉树的一些基本变量,根据 孩子表示法 来进行创建的二叉树如图所示

public class BinaryTree {
    static class TreeNode{
        public TreeNode left;
        public TreeNode right;
        public char val;

        public TreeNode(char val){
            this.val = val;
        }
    }

    public TreeNode createTree(){
        TreeNode A = new TreeNode('A');
        TreeNode B = new TreeNode('B');
        TreeNode C = new TreeNode('C');
        TreeNode D = new TreeNode('D');
        TreeNode E = new TreeNode('E');
        TreeNode F = new TreeNode('F');
        TreeNode G = new TreeNode('G');
        TreeNode H = new TreeNode('H');

        A.left = B;
        A.right = C;
        B.left = D;
        B.right = E;
        E.right = H;
        C.left = F;
        C.right = G;

        return A;
    }
}

再次提醒:上述代码并不是创建二叉树的方式,只是为了减少学习成本而简单实现的二叉树

通过调试可以看到,A的左子树是B,A的右子树为C,依次向下推。

public class Test {
    public static void main(String[] args) {
        BinaryTree binaryTree = new BinaryTree();
        BinaryTree.TreeNode root = binaryTree.createTree();
    }
}

二叉树的遍历

二叉树的遍历方式有:前序遍历,中序遍历,后序遍历以及层序遍历。这里先主要了解前中后序遍历,层序遍历后序会以例题的方式提出来。

  • 前序遍历:依照 根结点 ——> 根的左子树 ——> 根的右子树 进行遍历
  • 中序遍历:依照 根的左子树 ——> 根结点 ——> 根的右子树 进行遍历
  • 后序遍历:依照 根的左子树 ——> 根的右子树 ——> 根结点 进行遍历

 可以把前面的前中后看作是根据 根结点的位置 来定义的,方便记忆。

这三种遍历的实现都是依靠递归来实现的,通过根节点的形式上的不断变化来实现递归。

 前序遍历

依照 根结点 ——> 根的左子树 ——> 根的右子树 进行遍历。

    //前序遍历
    public void preOrder(TreeNode root){
        if(root == null){
            return;
        }
        System.out.print(root.val + " ");
        preOrder(root.left);
        preOrder(root.right);
    }
public class Test {
    public static void main(String[] args) {
        BinaryTree binaryTree = new BinaryTree();
        BinaryTree.TreeNode root = binaryTree.createTree();
        System.out.print("前序遍历:");
        binaryTree.preOrder(root);
    }
}

输出结果为:

整个过程可以对比着下面这张图来看。

中序遍历 

依照 根的左子树 ——> 根结点 ——> 根的右子树 进行遍历

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

输出结果为:

 后序遍历

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

 输出结果为:

这篇文章到这里就结束了,主要介绍了树和二叉树的概念方面的大致内容,以及实现二叉树的创建三种遍历方式

之后也会进行二叉树基本操作的实现以及对应问题的自己的理解,如果有不妥的地方,还请指出,一定会进行改正。

完整代码

BinaryTree类

public class BinaryTree {
    static class TreeNode{
        public TreeNode left;
        public TreeNode right;
        public char val;

        public TreeNode(char val){
            this.val = val;
        }
    }

    public TreeNode createTree(){
        TreeNode A = new TreeNode('A');
        TreeNode B = new TreeNode('B');
        TreeNode C = new TreeNode('C');
        TreeNode D = new TreeNode('D');
        TreeNode E = new TreeNode('E');
        TreeNode F = new TreeNode('F');
        TreeNode G = new TreeNode('G');
        TreeNode H = new TreeNode('H');

        A.left = B;
        A.right = C;
        B.left = D;
        B.right = E;
        E.right = H;
        C.left = F;
        C.right = G;

        return A;
    }

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

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

Test类

public class Test {
    public static void main(String[] args) {
        BinaryTree binaryTree = new BinaryTree();
        BinaryTree.TreeNode root = binaryTree.createTree();
        System.out.print("前序遍历:");
        binaryTree.preOrder(root);
        System.out.println();
        System.out.print("中序遍历:");
        binaryTree.inOrder(root);
        System.out.println();
        System.out.print("后序遍历:");
        binaryTree.postOrder(root);
    }
}

标签:遍历,TreeNode,二叉树,new,root,public
From: https://blog.csdn.net/xiaochuan_bsj/article/details/142111704

相关文章

  • 【洛谷 P5076】【深基16.例7】普通二叉树(简化版)题解(多重集合+lower_bound+upper_bound
    【深基16.例7】普通二叉树(简化版)题目描述您需要写一种数据结构,来维护一些数(都是以内的数字)的集合,最开始时集合是空的。其中需要提供以下操作,操作次数不超过:查询数的排名(排名定义为比当前数小的数的个数。若有多个相同的数,应输出最小的排名)。查询排名为的数。求的前驱(......
  • 力扣热题100 - 二叉树:将有序数组转换为二叉搜索树
    题目描述:题号:108给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 平衡 二叉搜索树。解题思路:思路一:中序构建二叉树选择根节点:首先,选择数组的中间元素作为根节点。这样做可以确保生成的二叉搜索树尽可能平衡。递归构建子树:将数组分......
  • 【代码随想录Day13】二叉树Part01
    理论基础文章讲解:代码随想录二叉树节点的定义:publicclassTreeNode{intval;TreeNodeleft;TreeNoderight;TreeNode(){}TreeNode(intval){this.val=val;}TreeNode(intval,TreeNodeleft,TreeNoderight){this.val......
  • 【Python】排序算法及二叉树讲解(冒泡 选择 插入 二分查找 二叉树的广度优先和三种深
    排序算法​所谓排序,使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作​排序算法,就是如何使得记录按照要求排列的方法​排序算法在很多领域是非常重要​在大量数据的处理方面:一个优秀的算法可以节省大量的资源。​在各个领域中考虑到数据的......
  • 代码随想录算法 - 二叉树
    题目1226.翻转二叉树给你一棵二叉树的根节点root,翻转这棵二叉树,并返回其根节点。示例1:输入:root=[4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]示例2:输入:root=[2,1,3]输出:[2,3,1]示例3:输入:root=[]输出:[]提示:树中节点数目范围在[0,100]内-100<=Node.val......
  • Day11 二叉树 part01| LeetCode
    理论基础二叉树的种类满二叉树完全二叉树二叉搜索树平衡二叉搜索树存储方式:数组、链式二叉树的遍历方式深度优先遍历前序(递归法、迭代法)中序(递归法、迭代法)后序(递归法、迭代法)广度优先遍历层序(迭代法)二叉树的定义publicclassTreeNode{......
  • C ++ 从单链表到创建二叉树到二叉树的遍历(结构体)
    首先我们要了解二叉树的数据结构是什么,本质上二叉树是一个有两个节点的链表,我们先了解的单链表的相关定义单链表创建一个朴素的单链表#include<iostream>usingnamespacestd;structNode{intval;Node*next;Node(intx):val(x),next(nullptr){}......
  • 平衡二叉树,二叉树的最大深度
    #include<iostream>#include<vector>#include<queue>#include<cmath>usingnamespacestd;classTreeNode{public: intval; TreeNode*left; TreeNode*right; TreeNode(intvalue):val(value),left(nullptr),right(nullptr){ }}......
  • 二叉树(这节主讲二叉树中的递归)
    目录二叉树的遍历:1.前序遍历:根->左子树->右子树2.中序遍历:左子树->根->右子树3.后序遍历:左子树->右子树->根4.层序遍历:从第一层到最后一层,一层一层地遍历二叉树的基本结构:二叉树中的常用接口:构造一个节点:构建二叉树:二叉树销毁:二叉树节点个数:二叉树叶子节点个数:二......
  • 数据结构--二叉树(C语言实现,超详细!!!)
    文章目录二叉树的概念代码实现二叉树的定义创建一棵树并初始化组装二叉树前序遍历中序遍历后序遍历计算树的结点个数求二叉树第K层的结点个数求二叉树高度查找X所在的结点查找指定节点在不在完整代码二叉树的概念二叉树(BinaryTree)是数据结构中一种非常重要的树形......