TreeNode实用方法

  因为刷题的时候经常碰到树相关的题目,但是测试的时候老不方便了,总不能每次都一个节点一个节点去new吧!当然我开始就是这么做的,后来实在是懒得写一大堆测试代码,就写了俩方法,一个根据数组生成节点,一个遍历获取节点的所有子节点,并保存为字符串。

treeToString 获取输出树节点以及所有子节点并生成字符串
convertArrToTree 数组生成树

package com.radish.leetcode.tree;import java.util.ArrayList;
import java.util.List;/*** @Description* @Author Radish* @Date 2020/3/13*/public class TreeNode {public int val;public TreeNode left;public TreeNode right;public TreeNode(int x) { val = x; }TreeNode(int val, TreeNode left, TreeNode right) {this.val = val;this.left = left;this.right = right;}/**** @param depth 当前要找的是第几层* @param nodes*/public void getStr(int depth, List<TreeNode> nodes) {int nodeCount = 0;//从头到depth-1层的元素数量int nums = (int)Math.pow(2,depth-1) - 1;//depth-1层元素数量int nums1 = (int)Math.pow(2,depth - 2);//第depth-1层第一个元素下标值int i = nums - nums1;//那就不是深度优先遍历而是广度优先遍历了嗷TreeNode node;for (; i < nums; i++) {node = nodes.get(i);if (node == null) {nodes.add(null);nodes.add(null);} else {if ((node.left != null && (node.left.left != null || node.left.right != null)) ||(node.right != null && (node.right.left != null || node.right.right != null))) nodeCount++;nodes.add(node.left);nodes.add(node.right);}}if (nodeCount > 0) getStr(depth + 1, nodes);}@Overridepublic String toString() {return String.valueOf(val);}/*** 层序遍历一棵树的元素并转化为字符串* @param node* @return*/public static String treeToString(TreeNode node) {//每一层遍历并输出List<TreeNode> nodes = new ArrayList<>();nodes.add(node);if (node.left != null || node.right != null) { node.getStr(2,nodes);}return nodes.toString();}/*** 将数组转化为一棵树,层序遍历* @param nums* @return*/public static TreeNode convertArrToTree(Integer[] nums) {TreeNode[] nodes = new TreeNode[nums.length];//获取层数,根据层数,创建每一层元素,创建好的节点放到数组里,方便double depth = (Math.log(nums.length + 1) / Math.log(2));
//        if (depth > (int)depth) depth = (int)depth + 1;for (int i = nums.length - 1; i >= 0; i--) {if (nums[i] == null) nodes[i] = null;else {nodes[i] = new TreeNode(nums[i]);//获取节点深度
//                double vv = Math.log(i + 1) / Math.log(2);
//                int v = vv > (int)vv ? (int)vv + 1 : (int) vv + 1;//获取左右节点if (nums.length > (2 * i + 1)) {nodes[i].left = nodes[2 * i + 1];}if (nums.length > (2 * i + 2)) {nodes[i].right = nodes[2 * i + 2];}}}return nodes[0];}
}

这个代码写的有点罗里吧嗦的…刚开始还搞出了几个bug,不过经过一段时间的使用,并没有啥问题,我想应该ok了!

TreeNode实用方法相关推荐

  1. cookie和url参数获取的常规实用方法合集(ES6)

    //获取某一个cookie的值 const getCookie = key => {var k = key, dc = document.cookie;if (dc.length > 0) ...

  2. ASP.NET技巧:两个截取字符串的实用方法

    两个截取字符串的实用方法(超过一定长度自动换行) 1/** <summary> 2        /// 截取字符串,不限制字符串长度 3        /// </summary& ...

  3. Python中os和shutil模块实用方法集锦

    Python中os和shutil模块实用方法集锦 类型:转载 时间:2014-05-13 这篇文章主要介绍了Python中os和shutil模块实用方法集锦,需要的朋友可以参考下 复制代码代码如下: ...

  4. 离线安装python第三方库的实用方法:解决公司内网,服务器/电脑不能上网却需要安装python三方库问题(上:Windows环境中)

    离线安装python第三方库的实用方法:解决公司内网,服务器/电脑不能上网却需要安装python三方库问题(上:Windows环境中) 参考文章: (1)离线安装python第三方库的实用方法:解决公 ...

  5. (二) LtRecyclerView v2.x (更多实用方法)

    (一) 超简单自定义上下刷新布局-LtRecyclerView v2.x版本(基本使用) (二) LtRecyclerView v2.x (更多实用方法) (三) LtRecyclerView v2. ...

  6. clob类型用java怎么存,Java 储存和读取 oracle CLOB 类型字段的实用方法

    当前位置:我的异常网» 编程 » Java 储存和读取 oracle CLOB 类型字段的实用方法 Java 储存和读取 oracle CLOB 类型字段的实用方法 www.myexceptions. ...

  7. C#WinForm WebBrowser (二) 实用方法总结

    实用方法1:获取状态栏信息 void webBrowser1_StatusTextChanged(object sender, EventArgs e){ label1.Text = webBrows ...

  8. ipa解包打包工具_ios打包ipa的四种实用方法(.app转.ipa)

    总结一下,目前.app包转为.ipa包的方法有以下几种: 1.Apple推荐的方式,即实用xcode的archive功能 Xcode菜单栏->Product->Archive->三选 ...

  9. ios打包ipa的四种实用方法(.app转.ipa)

    [原]ios打包ipa的四种实用方法(.app转.ipa) 总结一下,目前.app包转为.ipa包的方法有以下几种: 1.Apple推荐的方式,即实用xcode的archive功能 Xcode菜单栏- ...

最新文章

  1. GreenPlum学习笔记:基础知识
  2. 汽车加油c语言作业,算法作业—汽车加油问题
  3. 【小白学习keras教程】一、基于波士顿住房数据集训练简单的MLP回归模型
  4. JS构造map/dict结构
  5. 用户登录和注册的功能
  6. 程序员面试金典 - 面试题 02.05. 链表求和
  7. python2 http请求post、get
  8. 这是自己的第一篇博客
  9. ide在控制台输入编译命令_编译原理、VC的构成以及用VC2010建立C程序
  10. windows php redis扩展安装,怎么在Windows下安装PHP的Redis扩展服务
  11. 2017计算机办公自动化试题,2017年办公自动化考试试题及解答
  12. [配套工具] 【新手福音】最简单的大漠插件注册方法 只需四行代码 每行附有详细说明
  13. 腾讯地图获取地址的经度和纬度
  14. [洛谷P1338] 末日的传说
  15. 云服务器-华为云服务器ECS挂载对象存储服务OBS教程
  16. 【产品运营从0到1】资深产品运营推荐的互联网产品运营人员必看书籍
  17. VMware解决:未能将管道连接到虚拟机: 所有的管道范例都在使用中。
  18. 笔记-项目干系人管理-控制干系人参与
  19. [CSP-S 2022] 策略游戏
  20. spring 定时器时间配置

热门文章

  1. JavaWeb毕业设计-蛋糕商城系统(idea可用)
  2. (完整答案)2021年广东财经大学硕士研究生入学考试试卷--统计学0714
  3. 关于微信小程序的一些看法
  4. CF549H Degenerate Matrix
  5. 进度条警告!TheBrain 11落幕!超多思维导图新功能即将登陆12版
  6. 图灵头像印上50英镑新钞,取代蒸汽机之父瓦特,赶在图灵生日之际发行
  7. 熊猫卡丁车图片android版,熊猫卡丁车-宝宝巴士
  8. marktext 文字居中_MarkText - Markdown文本编辑器,做笔记和写作
  9. Springboot连接redis配置
  10. 奇怪的messagebeep()