Leetcode 与树(TreeNode )相关的题解测试工具函数总结
最近在剑指Offer上刷了一些题目,发现涉及到数据结构类的题目,如果想在本地IDE进行测试,除了完成题目要求的算法外,还需要写一些辅助函数,比如树的创建,遍历等,由于这些函数平时用到的地方比较多,并且也能加深对常用数据结构的理解,这里将Leetcode中与树(TreeNode)相关题目会用到的测试辅助函数做一个总结。
代码文件说明
- LeetCode.java 剑指Offer在线编程中关于树的数据结构定义
- TreeHelper.java: 主要是和树相关的常用操作函数,包括:二叉树的创建、三种遍历、获取树的节点数,高度、判断是否为二叉搜索树,以及搜索二叉树的创建、插入、删除
- TreeHelperTest.java: 主要用来对TreeHelper.java中的函数进行测试
- Solution18.java:LeetCode 剑指Offer在线编程第18道题"二叉树的镜像"题解,和本地测试方法
源代码
1.TreeNode.java
package structure;
public class TreeNode {
public int val = 0;
public TreeNode left = null;
public TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
2.TreeHelper.java
package structure;
import static java.lang.Math.max;
public class TreeHelper {
static int index;
static String[] values;
public TreeHelper(){}
// 根据形如”1,2,#,4,5,#,7,#“的字符串建立二叉树,其中#代表该节点为空
public void setValues(String treeValues) {
values = treeValues.split(",");
index = 0;
}
// 递归建立二叉树
public TreeNode createTree() {
TreeNode node = null;
if(index < values.length){
if (values[index].equals("#")) {
index++;
return null;
}
node = new TreeNode(Integer.parseInt(values[index]));
index++;
node.left = createTree();
node.right = createTree();
}
return node;
}
//前序遍历
public void preOrder(TreeNode root) {
if (root == null) {
return;
} else {
System.out.print(root.val + " ");
preOrder(root.left);
preOrder(root.right);
}
}
//中序遍历
public void inOrder(TreeNode root) {
if (root == null) {
return;
} else {
preOrder(root.left);
System.out.print(root.val + " ");
preOrder(root.right);
}
}
//后序遍历
public void postOrder(TreeNode root) {
if (root == null) {
return;
} else {
preOrder(root.left);
preOrder(root.right);
System.out.print(root.val + " ");
}
}
//获取二叉树的节点个数
public int getNodeNum(TreeNode root) {
if (root == null) {
return 0;
}
return 1 + getNodeNum(root.left) + getNodeNum(root.right);
}
//获取二叉树的高度
public int getTreeHeight(TreeNode root) {
if (root == null) {
return 0;
}
return 1 + max(getTreeHeight(root.left), getTreeHeight(root.right));
}
//创建二叉搜索树BST
public TreeNode createSearchTree(int[] treeValues){
TreeNode rootBST = null;
for (int value : treeValues) {
rootBST = insertNode(rootBST,value);
}
return rootBST;
}
//判断一个二叉树是否为二叉搜索树,时间复杂度O(1)
public boolean isBST(TreeNode root) {
return isBSTResolve(root, Integer.MIN_VALUE, Integer.MAX_VALUE);
}
public boolean isBSTResolve(TreeNode root, int min, int max) {
if (root == null) {
return true;
}
if (root.val < min || root.val > max) {
return false;
}
return isBSTResolve(root.left, min, root.val) && isBSTResolve(root.right, root.val, max);
}
//根据值查找二叉树搜索树root的某个节点
public TreeNode findNode(TreeNode rootBST, int val) {
if (rootBST == null) {
return null;
} else if (rootBST.val < val) {
return findNode(rootBST.right, val);
} else if (rootBST.val > val) {
return findNode(rootBST.left, val);
}
return rootBST;
}
//向二叉搜索树中插入值val
public TreeNode insertNode(TreeNode rootBST, int val) {
if (rootBST == null) {
rootBST = new TreeNode(val);
} else {
if (val < rootBST.val) {
rootBST.left = insertNode(rootBST.left, val);
} else if (val > rootBST.val) {
rootBST.right = insertNode(rootBST.right, val);
}
}
return rootBST;
}
//删除二叉树中某个值为val的节点
public TreeNode deleteNode(TreeNode rootBST, int val) {
if (findNode(rootBST, val) == null) {
System.out.println("要删除的节点不存在!");
} else {
if (val < rootBST.val) {
rootBST.left = deleteNode(rootBST.left, val);
} else if (val > rootBST.val) {
rootBST.right = deleteNode(rootBST.right, val);
} else { //rootBST就是要被删除的节点
if (rootBST.left != null && rootBST.right != null) { //被删除的节点的左右子节点均存在
TreeNode tmp = findMinNode(rootBST.right); //从右子树找到值最小的节点填充删除节点
rootBST.val = tmp.val;
rootBST.right = deleteNode(rootBST.right, rootBST.val); //删除右子树值最小的元素
} else { //被删除的节点只有一个或者无子节点存在
//被删除节点的左子节点为空,则右子节点取代根节点
if (rootBST.left == null) {
rootBST = rootBST.right;
} else {
rootBST = rootBST.left;
}
}
}
}
return rootBST;
}
// 找到二叉搜索树中值最小的节点
public TreeNode findMinNode(TreeNode rootBST) {
if (rootBST == null) {
return null;
} else if (rootBST.left == null) {
return rootBST;
}
return findMinNode(rootBST.left);
}
}
3.TreeHelperTest.java
package test;
import structure.TreeHelper;
import structure.TreeNode;
class treeHelperTest {
public static void main(String[] args) {
String treeNodeValues = "1,2,#,#,3,4,#,#,5,6,#,8,#,#";
TreeHelper treeHelper = new TreeHelper();
treeHelper.setValues(treeNodeValues);
try {
TreeNode root = treeHelper.createTree();
System.out.println("创建二叉树成功!");
System.out.println("前序遍历二叉树:");
treeHelper.preOrder(root);
System.out.println();
System.out.println("中序遍历二叉树:");
treeHelper.inOrder(root);
System.out.println();
System.out.println("后序遍历二叉树:");
treeHelper.postOrder(root);
System.out.println();
System.out.printf("二叉树的节点数目:%d\n", treeHelper.getNodeNum(root));
System.out.printf("二叉树的高度:%d\n", treeHelper.getTreeHeight(root));
System.out.println("二叉树是否为二叉搜索树:" + String.valueOf(treeHelper.isBST(root)));
} catch (Exception e) {
e.printStackTrace();
}
try {
TreeNode rootBST = treeHelper.createSearchTree(new int[]{2, 4, 3, 1, 9, 7, 6, 8});
System.out.println("创建二叉搜索树成功!");
System.out.println("二叉树是否为二叉搜索树:" + String.valueOf(treeHelper.isBST(rootBST)));
System.out.println("中序遍历二叉搜索树:");
treeHelper.inOrder(rootBST);
System.out.println();
rootBST = treeHelper.insertNode(rootBST, 5);
System.out.println("中序遍历插入5后的二叉搜索树:");
treeHelper.inOrder(rootBST);
System.out.println();
rootBST = treeHelper.deleteNode(rootBST, 6);
System.out.println("中序遍历删除6后的二叉搜索树:");
treeHelper.inOrder(rootBST);
System.out.println();
} catch (Exception e) {
e.printStackTrace();
}
}
}
测试结果如下

4.剑指Offer在线编程第18道题"二叉树的镜像"

Solution18
import structure.TreeHelper;
import structure.TreeNode;
/*
* Q:操作给定的二叉树,将其变换为源二叉树的镜像
* tag: 树
*/
public class Solution18 {
public static void main(String[] args) {
Solution18 s = new Solution18();
s.testMirror();
}
public void Mirror(TreeNode root) {
if(root == null){
return;
}
if(root.left == null){
root.left = root.right;
root.right = null;
Mirror(root.left);
}
else if(root.right == null){
root.right = root.left;
root.left = null;
Mirror(root.right);
}
else{
TreeNode temp = root.left;
root.left = root.right;
root.right = temp;
Mirror(root.right);
Mirror(root.left);
}
}
public void testMirror(){
TreeHelper treeHelper = new TreeHelper();
String treeValues = "1,2,#,#,3,4,#,#,5,6,#,8,#,#";
treeHelper.setValues(treeValues);
TreeNode root = treeHelper.createTree();
System.out.println("中序遍历二叉树:");
treeHelper.inOrder(root);
System.out.println();
Mirror(root);
System.out.println("中序遍历二叉树的镜像:");
treeHelper.inOrder(root);
System.out.println();
}
}
运行结果如下:

Leetcode 与树(TreeNode )相关的题解测试工具函数总结的更多相关文章
- 【LeetCode】树(共94题)
[94]Binary Tree Inorder Traversal [95]Unique Binary Search Trees II (2018年11月14日,算法群) 给了一个 n,返回结点是 1 ...
- Leetcode解题-树(5.0.0)基础类
与第二章类似,LeetCode指定了TreeNode实现.为了方便后续习题的编写和测试,创建一个基础父类,包含TreeNode实现,以及create()和print()创建和打印树的方法.其中crea ...
- C#版[击败99.69%的提交] - Leetcode 242. 有效的同构异形词 - 题解
C#版 - Leetcode 242. 有效的同构异形词 - 题解 Leetcode 242.Valid Anagram 在线提交: https://leetcode.com/problems/val ...
- LeetCode总结 -- 树的性质篇
树的性质推断是树的数据结构比較主要的操作,一般考到都属于非常easy的题目,也就是第一道入门题.面试中最好不能有问题,力求一遍写对.不要给面试官不论什么挑刺机会.LeetCode中关于树的性质有下面题 ...
- C#版 - Leetcode 504. 七进制数 - 题解
C#版 - Leetcode 504. 七进制数 - 题解 Leetcode 504. Base 7 在线提交: https://leetcode.com/problems/base-7/ 题目描述 ...
- C#版(打败99.28%的提交) - Leetcode 347. Top K Frequent Elements - 题解
版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - L ...
- LeetCode: Palindrome 回文相关题目
LeetCode: Palindrome 回文相关题目汇总 LeetCode: Palindrome Partitioning 解题报告 LeetCode: Palindrome Partitioni ...
- 数据库相关文章转载(2) MySQL自带的性能压力测试工具mysqlslap详解
PS:今天一同事问我有木有比较靠谱的mysql压力测试工具可用.其实mysql自带就有一个叫mysqlslap的压力测试工具,还是模拟的不错的.下面举例说说.mysqlslap是从5.1.4版开始的一 ...
- LeetCode总结 -- 树的求和篇
树的求和属于树的题目中比較常见的,由于能够有几种变体,灵活度比較高,也能够考察到对于树的数据结构和递归的理解. 一般来说这些题目就不用考虑非递归的解法了(尽管事实上道理是跟LeetCode总结 -- ...
随机推荐
- vue计算属性和方法的区别
计算属性: <div id="example"> <p>{{ now }}"</p> </div> <script& ...
- 理解RabbitMQ中的AMQP-0-9-1模型
前提 之前有个打算在学习RabbitMQ之前,把AMQP详细阅读一次,挑出里面的重点内容.后来找了下RabbitMQ的官方文档,发现了有一篇文档专门介绍了RabbitMQ中实现的AMQP模型部分,于是 ...
- 实验21:IPv6
九.IPv6 1.IPv6(RIP) 实验目的:熟悉IPv6的配置,并经过动态路由协议RIP,使三台路由器相互通讯设备需求:3640三台实验过程: xdbr_R1#sh runipv6 unicast ...
- 【干货】国外程序员整理的 C++ 资源大全–日常工作,我觉得用处确实很大,所以分享
考到群里的纯技术文章比较少,发一篇,其实不限于C++可用,这些东西 百度文库链接10 百度云下载15 我个人感觉很有用的,因为其中有些东西时 头儿让我在项目里用的 关于 C++ 框架.库和资源的一些 ...
- JavaScript所有函数和内置方法
Number isFiniter() 检测传入的的数值是否在无穷大和无穷小之间(有限数字或者是可转换成有限数字)返回true,否则返回false.NaN返回false. isFinite(Number ...
- Linux/UNIX编程:实现简单 tee 命令
思路很简单,从标准输入文件描述符读入数据,然后同时向标准输出和参数指定的文件写出数据:如果加了 -a 选项,则以追加的方式向文件写出数据.还没了解 getopt() 函数就没判断参数是否合法. #in ...
- AWS的边缘计算平台GreenGrass和IoT
AWS的边缘计算平台GreenGrass和IoT 为什么需要有边缘计算? 如今公有云和私有云平台提供的服务已经连接上了绝大多数的桌面设备和移动设备.但是更多的设备比如,车辆,工程机械,医疗设备,无人机 ...
- python UnicodeDecodeError: 'gbk' codec can't decode byte 0x99 in position 87: illegal multibyte sequence异常解决
我们处理文本文件时,经常会遇到这样的报错: UnicodeDecodeError: 'gbk' codec can't decode byte 0x99 in position 87: illegal ...
- vuejs之vue和springboot后端进行通信
一.新建一个vue项目,建立好后的相关文件 查看一下新建好的vue项目的结构: 当前各个文件中的内容: App.vue:主入口 <template> <div id="ap ...
- 使用 H5 和 webGL 的智慧城市 3D 监控
前言 中共中央.国务院在今年12月印发了<长江三角洲区域一体化发展规划纲要>(下文简称<纲要>),并发出通知,要求各地区各部门结合实际认真贯彻落实. <纲要>强调, ...