【二叉树遍历和练习】

文章目录

  • 一、二叉树前中后遍历
  • 二、获取节点个数
  • 三.获取叶子节点个数
  • 四.获取第k层节点个数
  • 五.求二叉树的高度,时间复杂度O(N)
  • 六.检测值为value的元素是否存在
  • 七. 检查两颗树是否相同
  • 八.判断一棵二叉树是不是平衡二叉树
  • 九.一个二叉树的根节点 root , 检查它是否轴对称
  • 十. 判断subRoot是不是root的子树
  • 十一.翻转二叉树
  • 总结


一、二叉树前中后遍历

public class BinaryTree {static class TreeNode{public char val;public TreeNode left;public TreeNode right;public TreeNode(char val) {this.val = val;}}public TreeNode creatTree(){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;}inOrder(root.left);System.out.print(root.val+" ");inOrder(root.right);}//后序遍历void postOrder(TreeNode root){//左右根if(root == null){return;}postOrder(root.left);postOrder(root.right);System.out.print(root.val+" ");}public static void main(String[] args) {BinaryTree binaryTree = new BinaryTree();BinaryTree.TreeNode root = binaryTree.creatTree();binaryTree.preOrder(root);System.out.println();binaryTree.inOrder(root);System.out.println();binaryTree.postOrder(root);}
}

二、获取节点个数

    public int nodeSize;int size(TreeNode root){if (root == null){return 0;}nodeSize++;size(root.left);size(root.right);return nodeSize;}//子问题思路解决:整棵树的节点=左子树的节点+右子数的节点+1int size2(TreeNode root){if (root == null){return 0;}return size2(root.left)+size2(root.right)+1;}

三.获取叶子节点个数

public int leafSize;int getLeafNodeCount(TreeNode root){if (root == null){return 0;}if (root.left == null && root.right == null){leafSize++;}getLeafNodeCount(root.left);getLeafNodeCount(root.right);return leafSize;}

四.获取第k层节点个数

 public int leveSize;int getleveNodeCount(TreeNode root,int k){if(root == null){return 0;}if (k == 1) {return 1;}return getleveNodeCount(root.left,k-1)+ getleveNodeCount(root.right,k-1);}

五.求二叉树的高度,时间复杂度O(N)

int getHeight(TreeNode root){if (root == null){return 0;}int 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 ret1 = find(root.left,val);if (ret1 != null){return ret1;}TreeNode ret2 = find(root.right,val);if (ret2 != null){return ret2;}return null;}

七. 检查两颗树是否相同

    public boolean isSameTree(TreeNode p, TreeNode q) { if( (p == null && q !=null) || (p != null && q == null) ){return false;}if(p == null && q == null){return true;}if(p.val !=q.val){return false;}return isSameTree(p.left,q.left) && isSameTree(p.right,q.right);}

八.判断一棵二叉树是不是平衡二叉树

时间复杂度O(N)

 public boolean isBalanced(TreeNode root) {if(root == null){return true;}return getHeight(root)>=0;}int getHeight(TreeNode root) {if (root == null){return 0;}int leftHeight =getHeight(root.left);if(leftHeight < 0){return -1;}int rightHeight = getHeight(root.right);if(leftHeight >= 0 && rightHeight >= 0 && Math.abs(leftHeight - rightHeight) <=1){return Math.max(leftHeight,rightHeight)+1;}else{return -1;}}

九.一个二叉树的根节点 root , 检查它是否轴对称

public boolean isSymmetric(TreeNode root) {if(root == null) return true;return isSymmetricChild(root.left,root.right);}private boolean isSymmetricChild(TreeNode leftTree,TreeNode rightTree){if((leftTree == null && rightTree != null) ||(leftTree != null && rightTree == null)){return false;}if(leftTree == null && rightTree == null){return true;}if(leftTree.val != rightTree.val){return false;}return isSymmetricChild(leftTree.left,rightTree.right) && isSymmetricChild(leftTree.right,rightTree.left);}

十. 判断subRoot是不是root的子树

//时间复杂度:O(m*n)public boolean isSubtree(TreeNode root,TreeNode subTree) {if(root == null || subTree == null) {return false;}//判断根节点是否相同if (isSameTree(root,subTree)){return true;}//判断左子树是否相同if(isSubtree(root.left, subTree)) {return true;}//判断右子树是否相同if(isSubtree(root.right, subTree)) {return true;}return false;}public boolean isSameTree(TreeNode p, TreeNode q) {if( (p == null && q !=null) || (p != null && q == null) ){return false;}if(p == null && q == null){return true;}if(p.val !=q.val){return false;}return isSameTree(p.left,q.left) && isSameTree(p.right,q.right);}

十一.翻转二叉树

    public TreeNode invertTree(TreeNode root){if(root == null){return null;}if(root.left == null && root.right == null){return root;}//交换左右节点TreeNode tmp = root.left;root.left = root.right;root.right = tmp;//交换左树invertTree(root.left);//交换右树invertTree(root.right);return root;}

总结

今天复习二叉树练习。
时隔一个月继续更新文章,学校的考试周太可怕了=.= 怕挂科所以全身心投入复习,平时都学编程了,学校的课靠最后几周学完全部,也是挺厉害的哈哈。

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

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

相关文章

Hutool sqlserver 数据库简单操作-Db

项目中主数据库是mysql的&#xff0c;使用mybatis处理非常舒服。项目中还会极少量涉及一个sqlserver数据源的读取操作&#xff0c;虽然mybatis是支持多数据源的&#xff0c;但是感觉用起来不那么顺手偏重一些了。 最初我的想法是涉及sqlserver的库的操作直接使用jdbc来实现就好…

java基于Spring Boot的灾害应急救援评估调度平台

灾害应急救援平台的目的是让使用者可以更方便的将人、设备和场景更立体的连接在一起。能让用户以更科幻的方式使用产品&#xff0c;体验高科技时代带给人们的方便&#xff0c;同时也能让用户体会到与以往常规产品不同的体验风格。&#xff08;1&#xff09;鉴于该系统是一款面向…

深入理解和应用C++ std::shared_ptr别名构造函数

深入理解和应用C std::shared_ptr别名构造函数 引言 在现代C中&#xff0c;智能指针是一个极为重要的工具&#xff0c;尤其std::shared_ptr以其自动内存管理、引用计数和多线程安全性等特性深受开发者喜爱。其中一个不太常用但功能强大的构造方式是别名构造函数&#xff0c;它…

C++ 设计模式之外观模式

【声明】本题目来源于卡码网&#xff08;题目页面 (kamacoder.com)&#xff09; 【提示&#xff1a;如果不想看文字介绍&#xff0c;可以直接跳转到C编码部分】 【简介】什么是外观模式 外观模式Facade Pattern , 也被称为“⻔⾯模式”&#xff0c;是⼀种结构型设计模式&#…

WordPress如何修改旧文章的发布日期让其变成新文章发布?

我们个人网站发展一段时间后&#xff0c;可能就不懂得发布什么内容了&#xff0c;这个时候可以考虑翻看以前的旧文章&#xff0c;必要时对其进行适当修改&#xff0c;然后修改它的发布日期变成当前日期重新发布&#xff0c;这样就会变成新文章重新出现在我们首页的文章列表中。…

libbpf-tips

使用 libbpf 编写 BPF 应用程序进阶技巧 本文地址&#xff1a;https://www.ebpf.top/post/top_and_tricks_for_bpf_libbpf 原文地址&#xff1a;https://www.pingcap.com/blog/tips-and-tricks-for-writing-linux-bpf-applications-with-libbpf/ 2020 年初&#xff0c;当使用…

numpy 筛选多段数据

目录 掩码方式 利用切片 掩码方式 range_to_remove list(range(77-1, 111-1)) list(range(122-1, 135-1))keep_mask np.ones(image0_cut.shape[0], dtypebool)keep_mask[range_to_remove] Falseprocessed_data image0_cut[keep_mask] 利用切片 import numpy as np# 假设…

基于Pytorch的身份证及其他证件检测矫正模型应用

前言 在做身份证和其他证件识别的时候&#xff0c;图片基本都不是摆正的状态&#xff0c;此时在进行OCR文字识别的提取文字信息的时候会出现很多误差&#xff0c;如何将证件摆正&#xff0c;再进行OCR文字识别就可以大大提高准确率。 准备工作 1、Python环境&#xff0c;在P…

tda7294功放电路图大全

简易电子管功放电路图&#xff08;一&#xff09; 6P3P单端A类电子管功放电路图 如图为6P3P单端A类电子管功放电路图。VT1、VT2直流通路串联。VT1构成普通的三极管共阴放大器&#xff0c;VTr2构成阴极输出器&#xff0c;对VT1而言VT2是一个带电流负反馈的高阻负载。音频信号由…

Leetcode2696. 删除子串后的字符串最小长度

Every day a Leetcode 题目来源&#xff1a;2696. 删除子串后的字符串最小长度 解法1&#xff1a;暴力 暴力做法是不断把 AB 和 CD 去掉&#xff0c;直到 s 中没有 AB 和 CD 为止。 代码&#xff1a; /** lc appleetcode.cn id2696 langcpp** [2696] 删除子串后的字符串最…

漏洞复现-金和OA jc6/servlet/Upload接口任意文件上传漏洞(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…

关于浮点数的四舍五入问题

最近有关注到&#xff0c;在C/C中&#xff0c;对于浮点数的四舍五入&#xff0c;与实际的有一些出入&#xff0c;我打算今天总结一下&#xff0c;并解释一下这是为啥&#xff0c; 好了&#xff0c;下面进入正题&#xff0c;都是干货哦&#xff0c;认真看完&#xff0c;留下你的…

【大模型应用】小白借助chatgpt开发谷歌插件

大模型正缓慢地渗透进入我们的生活&#xff0c;尽管目前还没有现象级的产品应用&#xff0c;但它已足以让我痴迷于它&#xff0c;我对它能够提升程序员的生产效率笃定无疑。 本次我用一个下午做了一次尝试&#xff0c;使用大模型帮助我开发一个谷歌插件。开发之前&#xff0c;…

西米支付:到底什么是NFT(数字藏品支付通道)(NFT支付通道)

NFT到底指的是什么呢&#xff1f; 数字藏品的实际意义在于它们打破了传统艺术品的物质形态束缚。数字藏品可以通过虚拟现实和区块链技术进行创作、展示和交易。它们不仅可以满足人们对艺术品的审美需求&#xff0c;还可以成为一种投资和资产保值增值的方式。数字藏品的实际意义…

排序——归并排序

文章目录 基本思想递归版本思路代码实现 非递归版思路代码实现 特性结果演示 基本思想 归并排序&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法,该算法是采用分治法&#xff08;Divide andConquer&#xff09;的一个非常典型的应用。将已有序的子…

开发实践6_缓存^中间件

以下学习 朔宁夫 开发工程师 课程。 缓存可提高程序响应速度。数据库缓存(可过期)/ Redis缓存(Key:Value)/ Memcacheed缓存/ 程序层缓存。 一 缓存 1. 数据库缓存 创建缓存数据表 // python manage.py createcachetable cache_table setting // # 缓存配置 CACHES {def…

第十部分 make 的运行

目录 一、make 的退出码 二、指定 Makefile 三、指定目标 “all” “clean” “install” “print” “dist” “TAGS” “check”和“test” 四、检查规则 五、make 的参数 一般来说&#xff0c;最简单的就是直接在命令行下输入 make 命令&#xff0c;make 命令会…

代码随想录算法训练营第20天(二叉树6 | 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树

二叉树 part06 654.最大二叉树解题思路 617.合并二叉树解题思路 700.二叉搜索树中的搜索解题思路 98.验证二叉搜索树解题思路误区 654.最大二叉树 又是构造二叉树&#xff0c;昨天大家刚刚做完 中序后序确定二叉树&#xff0c;今天做这个 应该会容易一些&#xff0c; 先看视频&…

12.云原生之kubesphere中应用部署方式

云原生专栏大纲 文章目录 k8s中应用部署Kubernetes常用命令 kubesphere中可视化部署应用创建工作负载服务暴露 helm部署应用helm命令行部署应用kubesphere中使用应用仓库 k8s中应用部署 在k8s中要想部署应用&#xff0c;需要编写各种yaml文件&#xff0c;一旦应用依赖比较复杂…

不同整数的最少数目和单词直接最短距离

写是为了更好的思考&#xff0c;坚持写作&#xff0c;力争更好的思考。 今天分享两个关于“最小、最短”的算法题&#xff0c;废话少说&#xff0c;show me your code&#xff01; 一、不同整数的最少数目 给你一个整数数组arr和一个整数k。现需要从数组中恰好移除k个元素&…