当前位置: 首页 > article >正文

java数据结构_二叉树_5.3 (几道例题搞定二叉树的遍历)

2.4 二叉树的存储

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

在这里介绍链式存储

二叉树的链式存储是通过一个一个的结点引用起来的的,常见的表示方法有二叉(孩子表示法)和三叉(孩子双亲表示法)表示方法,如下:

//孩子表示法

class Node {

        int val;   //数据域

        Node left;    //左孩子的引用,常常代表左孩子为根的整棵左子树

        Node right;  //右孩子的引用,常常代表右孩子为根的整棵右子树

}

// 孩子双亲表示法

class Node {

        int val;    //数据域

        Node left;   //左孩子的引用,常常代表左孩子为根的整棵左子树

        Node right; //右孩子的引用,常常代表右孩子为根的整棵右子树

        Node parent; //当前节点的根节点

}

孩子双亲表示法在后序的平衡树位置介绍,本文用孩子表示法来构建二叉树。

2.5 二叉树的基本操作

2.5.1 说明

在此先手动快速创建一棵简单的二叉树,用来学习基本相关操作,后续再回过头研究二叉树的真正创建方式。

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

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

    public TreeNode root; //将来这个引用 指向的就是根结点

/**
* 创建二叉树的简单方法
*/
    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;
        B.left = D;
        B.right = E;
        E.right = H;
        A.right = C;
        C.left = F;
        C.right = G;

        return A;
    }
}

 在IDEA中测试可以看到

实现的二叉树模拟图为:注意:上述代码并不是创建二叉树的方式,真正创建二叉树方式在后面会叙述。

回看二叉树的概念:二叉树是:

1. 空树

2. 非空:由根结点,根结点的左子树,根结点的右子树组成的

从概念和模拟图中可以发现,二叉树的定义是递归式形成的。

2.5.2 二叉树的遍历

1. 前 中 后序遍历

遍历(Traversal)是指沿着某条搜索路线依次对树中每个结点均做一次且仅做一次访问。访问结点所作的操作依赖于具体的应用问题(比如:打印结点内容,结点内容+1)。遍历是二叉树最重要的操作之一,是二叉树上进行其他运算的基础。

如果用N代表根结点,L代表根结点的左子树,R代表根结点的右子树,则根据根结点的先后次序有以下遍历方式:

NLR:前序遍历(Preorder Traversal 亦称先序遍历)——访问根结点--->根的左子树--->根的右子树。

LNR:中序遍历(Inorder Traversal)——根的左子树--->根节点--->根的右子树。

LRN:后序遍历(Postorder Traversal)——根的左子树--->根的右子树--->根节点。

2. 层序遍历

层序遍历就是从二叉树的根出发从上到下自左至右逐层逐个访问树的结点

补充:

树是递归定义的,每一棵树的遍历 都是以同样的方式进行遍历的,前 中 后 序遍历走的路线的相同的,不过是访问根结点的顺序不同

3. 如下图二叉树,给出该二叉树的三种遍历方式

前序(根左右):A B D E H C F G

中序(左根右):D B E H A F C G

后序(左右根):D H E B F G C A

4. 选择题

1.某完全二叉树按层次输出(同一层从左到右)的序列为 ABCDEFGH 。该完全二叉树的前序序列为()

A: ABDHECFG   B: ABCDEFGH   C: HDBEAFCG   D: HDEBFGCA  

 解:根据题意是按层次输出的序列为ABCDEFGH,可以画出二叉树模拟图为:

前序序列的顺序是根左右:A B D H E C F G

答案为 A

2.二叉树的先序遍历和中序遍历如下:先序遍历:EFHIGJK;中序遍历:HFIEJKG.则二叉树后序遍历的顺序为:

解:要根据两个顺序还原二叉树

先序遍历(根先后):E F H I G J K

中序遍历(左根右):H F I E J K G

因为先序遍历的顺序是根左右,则E为根,又因为中序遍历是根左右,所以中序遍历中,E左边的都是左子树,E右边的都是右子树,如图:

再看先序遍历E之后的结点是F,证明下一个根结点是F,在上图中H在F的左侧,即H是F的左子树,I是F的右子树

再看先序遍历F之后的结点H I 因为H和I在上图中,没有其他左子树,则继续看前序遍历I后面的元素G,即下一个根结点为G,在上图中,G没有右子树,只有J和K为左子树

再由前序遍历看G之后的元素是J,即下一个根结点为J,K在J的右边,则K为J的右子树

则上图为还原出来的二叉树模拟图,其后序遍历(左右根):H I F K J G E

  3.设一课二叉树的中序遍历序列:badce,后序遍历序列:bdeca,则二叉树前序遍历序列为()

A: adbce       B: decab       C: debac       D: abcde

中序遍历(左根右):b a d c e

后序遍历(左右根):b d e c a

这道题和第二题有一点不同的是,这个是后序遍历和中序遍历,前序遍历是先根再左右,后序遍历是先左右后根,所以要找到根结点,就要从后序遍历的最后一个结点开始。

此题中后序遍历最后一个结点为a,则a为根结点,再在中序遍历中,看到b为a的左子树,dce为a的右子树

再看后序遍历在a前面的元素c,则c为下一个根结点,d为c的左子树,e为c的右子树

上图为二叉树的模拟图,前序遍历(根左右):a b c d e

4.某二叉树的后序遍历序列与中序遍历序列相同,均为 ABCDEF ,则按层次输出(同一层从左到右)的序列为()

A: FEDCBA     B: CBAFED     C: DEFCBA     D: ABCDEF

解:

后序(左右根):A B C D E F

中序(左根右):A B C D E F

后序遍历最后一个结点是F,F为根结点,中序遍历中 A B C D E均在F左侧,为F的左子树

同理向下模拟该二叉树最终为:

层次输出为 F E D C B A


http://www.kler.cn/a/539738.html

相关文章:

  • 502 Bad Gateway 错误详解:从表现推测原因,逐步排查直至解决
  • ZU47DR 100G光纤 高性能板卡
  • CSGHub高效管理|解锁DeepSeek R1蒸馏模型 :高效推理的新选择
  • win32汇编环境,结构体的使用示例一
  • SpringBoot3与MyBatis-Plus
  • 38、【OS】【Nuttx】OSTest分析(3):参数传递
  • BMC开发技术栈指南
  • SQL自学,mysql从入门到精通 --- 第 14天,主键、外键的使用
  • Gitlab中如何进行仓库迁移
  • XILINX硬件设计-(1)LVDS接口总结
  • 【Arxiv 大模型最新进展】TableRAG: 提高大语言模型在理解和推理大规模表格数据的效率和性能
  • oscp备考,oscp系列——VulnOSv2靶场,两种方法获取低权限shell
  • 三星OEM版SSD固态硬盘Model码对应关系
  • 【Spring Boot】Spring Boot解决循环依赖
  • c++计算机教程
  • 5G技术解析:从核心概念到关键技术
  • Java 中 ArrayList 和 LinkedList 有什么区别?
  • 【WB 深度学习实验管理】利用 Hugging Face 实现高效的自然语言处理实验跟踪与可视化
  • SQL自学,mysql从入门到精通 --- 第 5 天,对函数的处理
  • 神经网络|(九)概率论基础知识-泊松分布及python仿真
  • MySQL与钉钉数据融合,加速企业付款退款自动化进程
  • Spring AI -使用Spring快速开发ChatGPT应用
  • 鸿蒙NEXT API使用指导之文件压缩和邮件创建
  • 【Spring】Spring MVC入门(一)
  • 如何将 Jupyter Notebook (.ipynb) 文件转换为 Python (.py) 文件
  • Git 常见错误与解决方案全指南