Java二叉树(2)

一、二叉树的链式存储

二叉树的存储分为顺序存储链式存储

(本文主要讲解链式存储)

二叉树的链式存储是通过一个一个节点引用起来的,常见的表示方式有二叉三叉

// 孩子表示法

class Node {

   int val; // 数据域

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

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

}

// 孩子双亲表示法

class Node {

   int val; // 数据域

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

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

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

}

孩子双亲表示法在后续介绍,本文采用孩子表示法来构建二叉树

二、二叉树的遍历

前序遍历:根  左  右

中序遍历:左  根  右

后序遍历:左  右  根

层序遍历:从上到下  从左到右  依次遍历

所有的遍历都是沿着某条路线进行的

 

上图二叉树的各遍历分别是:

前序:A B D C E F

中序:D B A E C F

后序:D B E F C A

层序:A B C D E F 

例题:

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

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

题解:

前序:ABDHECFG

2.二叉树的前序遍历和中序遍历如下:前序遍历:EFHIGJK;中序遍历:HFIEJKG.则二叉树根结点为()

A: E           B: F           C: G           D: H

题解:

后序遍历:H I F K J G E

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

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

题解:

前序遍历:a  b  c  d  e  

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

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

题解:

根据前几道题目的方法能画出二叉树:

层序遍历:F E D C B A 

注意:根据前序和后序不能创建二叉树,只能确定根的位置,无法确定左右子树的位置

三、二叉树的基本操作与图解


public class MyBinaryTree {static class TreeNode{public char val;public TreeNode left;public TreeNode right;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;C.left = F;C.right = G;E.right = H;return A;//根节点}// 前序遍历void preOrder(TreeNode root){if(root == null){return;}System.out.print(root.val+" ");preOrder(root.left);preOrder(root.right);}//中序遍历void inOrder(TreeNode root){if(root == null){return;}preOrder(root.left);System.out.print(root.val+" ");preOrder(root.right);}//后序遍历void postOrder(TreeNode root){if(root == null){return;}preOrder(root.left);preOrder(root.right);System.out.print(root.val+" ");}//节点个数public int size(TreeNode root){if(root==null){return 0;}int ret = size(root.left)+size(root.right)+1;return ret;//子问题思路}public int nodeSize;public void size2(TreeNode root){if(root==null){return ;}nodeSize++;size2(root.left);size2(root.right);}//整棵树的叶子节点个数public int getLeafNodeCount(TreeNode root){if(root==null){return 0;}//左子树的叶子节点+右子树的叶子节点就是整棵树的叶子if(root.left==null&&root.right==null){return 1;}return getLeafNodeCount(root.left)+getLeafNodeCount(root.right);}//遍历思路public int leafSize;public void getLeafNodeCount2(TreeNode root){if(root==null){return ;}//左子树的叶子节点+右子树的叶子节点就是整棵树的叶子if(root.left==null&&root.right==null){leafSize++;}getLeafNodeCount2(root.left);getLeafNodeCount2(root.right);}// 获取第K层节点的个数int getKLevelNodeCount(TreeNode root,int k){if(root==null){return 0;}if(k==1){return 1;}return getKLevelNodeCount(root.left,k-1)+getKLevelNodeCount(root.right,k-1);}// 获取二叉树的高度int getHeight(TreeNode root){if(root==null){return 0;}//整棵树的高度=左树高度和右树高度的最大值+1int leftHeight = getHeight(root.left);int rightHeight = getHeight(root.right);return leftHeight > rightHeight ? leftHeight+1 : rightHeight+1;}// 检测值为value的元素是否存在TreeNode find(TreeNode root, int val){if(root==null){return null;}if(root.val==val){return root;}TreeNode ret = find(root.left,val);if(ret !=null){return root;}ret = find(root.right,val);if(ret !=null){return root;}return null;}
}

递归遍历代码讲解:以前序遍历为例

 求节点个数代码图解:

获取k层节点的个数图解:

 获取二叉树的高度图解:

 

检测为value的值是否存在图解:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/610512.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【VS2019】x64 Native Tools Command Prompt for Vs 2019使用conda命令进入环境

【VS2019】x64 Native Tools Command Prompt for Vs 2019使用conda命令进入环境 安装完VS2019后,打开终端x64 Native Tools Command Prompt for Vs 2019,直接运行conda会出现‘conda’ 不是内部或外部命令,也不是可运行的程序 原因分析&am…

vite 和 rollup

Rollup Rollup 是一个 JavaScript 模块打包器,它可以将多个模块打包成一个单独的文件。 rollup 的特点: 不会生成过多的运行代码 可以多模块化规范打包 input(输入): 这是你的项目的入口点(即主要的 JavaScript 文…

[C++][算法基础]树的重心(树图DFS)

给定一颗树,树中包含 n 个结点(编号 1∼n)和 n−1 条无向边。 请你找到树的重心,并输出将重心删除后,剩余各个连通块中点数的最大值。 重心定义:重心是指树中的一个结点,如果将这个点删除后&a…

考研数学|零基础冲130复习方案+资料分享

如果想考130,那就一定要好好复习基础。 因为24年开始,考研的走向就已经发生了改变,考研数学开始越来越注重一下三点的考察: 基础知识的掌握程度计算能力解题能力 这三点环环相扣,每一个都要复习好才行。 在基础阶段…

Linux操作系统的学习

Linux系统的目录结构 / 是所有目录的顶点目录结构像一颗倒挂的树 Linux常用命令 常见命令 序号命令对应英文作用1lslist查看当前目录下的内容2pwdprint work directory查看当前所在目录3cd [目录名]change directory切换目录4touch [文件名]touch如果文件不存在,新…

《极域多媒体教室互动管理系统软件》控制方法大全

前言及背景: 当我坐在电脑前,打开它,点开谷歌,刚刚想打开百度,突然闪出来了: 该网页已被阻止!!! 正文: 1.极域控制原理: 好…

猝不及防 CCF-B ICPP 2024投稿延期至4月22日提交摘要 机会来了别错过

会议之眼 快讯 第53届ICPP(International Conference on Parallel Processing)即国际并行处理会议将于 2024年 8月12日-15日在瑞典哥特兰岛举行!ICPP是世界上最古老的连续举办的并行计算计算机科学会议之一。它是学术界、工业界和政府的研究…

MINI2440 开发板 给他干出来了

环境是ubuntu14.04。不要问我为什么是这个版本,因为之前的ubuntu12.04 环境干不出来,你去试试就知道了!各种资源包下载不下来。 输入启动参数: 进入MINI2440:别说心里一万个开心,启动完成,输入p…

【工具】NPS 内网穿透搭建

背景 在日常开发中经常会涉及到使用公网某个端口进行开发调试的情况,但我们日常开发的机器IP是非公网IP,所以需要使用内网穿透的手段,使我们的服务在公网上能被访问到。 常用的内网穿透工具分两大类,一类是付费/免费服务&#xf…

git修改本地提交历史邮箱地址

1、Git(Git) 2、修改Git本地提交历史中的邮箱地址 使用 git rebase 命令进行交互式重置。 具体步骤如下:(https://git-scm.com/docs/git-rebase) 1、查看提交历史: 使用 git log 命令列出提交历史&#x…

09 Php学习:数组和排序

数组概念 在PHP中,数组是一种复合数据类型,用于存储多个值。以下是关于PHP数组的详细解释: 索引数组:索引数组是最基本的数组类型,其中每个元素都有一个唯一的数字索引,从0开始递增。 关联数组&#xff…

标注平台工作流:如何提高训练数据质量与管理效率

世界发展日益依托数据的驱动,企业发现,管理不断增长的数据集却愈发困难。数据标注是诸多行业的一个关键过程,其中包括机器学习、计算机视觉和自然语言处理。对于大型语言模型(LLM)来说尤是如此,大型语言模型…