树定义及遍历

1、定义树

可以参考链表,链表遍历不方便,如果单链表有多个next指针,则就形成了树。

Java:

public class TreeNode {int val;TreeNode left, right;TreeNode(int val) { this.val = val; this.left = null;this.right = null;}
}

Python:

class TreeNode(object):def __init__(self, val=0, left=None, right=None):self.val = valself.left, self.right = None, None

C++:

struct TreeNode {int val;TreeNode *left;TreeNode *right;TreeNode(int x) : val(x), left(null), right(null) {}
};

C:

struct TreeNode {int val;struct TreeNode *left;struct TreeNode *right;
};

 2、树的遍历

  • 前序遍历:根节点→左子树→右子树

  • 中序遍历:左子树→根节点→右子树

  • 后序遍历:左子树→右子树→根节点

  • BFS(广度优先搜索):先访问上一层,在访问下一层,一层一层的往下访问

  • DFS(深度优先搜索):先访根节点,然后左结点,一直往下,直到最左结点没有子节点的时候然后往上退一步到父节点,然后父节点的右子节点在重复上面步骤……

代码:

1)Python前序、中序、后序遍历:
def preorder(self, root):if root:self.traverse_path.append(root.val);self.preorder(root.left);self.preorder(root.right);def inorder(self, root):if root:self.preorder(root.left);self.traverse_path.append(root.val);self.preorder(root.right);def postorder(self, root):if root:self.preorder(root.left);self.preorder(root.right);self.traverse_path.append(root.val);
2)Java遍历:
前序遍历:
// 递归
public static void preOrder(TreeNode tree) {if (tree == null)return;System.out.printf(tree.val + "");preOrder(tree.left);preOrder(tree.right);
}
// 非递归
public static void preOrder(TreeNode tree) {if (tree == null) return;Stack<TreeNode> q1 = new Stack<>();q1.push(tree);//压栈while (!q1.empty()) {TreeNode t1 = q1.pop();//出栈System.out.println(t1.val);if (t1.right != null) {q1.push(t1.right);}if (t1.left != null) {q1.push(t1.left);}}
}
中序遍历:
// 递归
public static void inOrder(TreeNode node) {if (node == null)  return;inOrder(node.left);System.out.println(node.val);inOrder(node.right);
}
// 非递归
public static void inOrder(TreeNode tree) {Stack<TreeNode> stack = new Stack<>();while (tree != null || !stack.isEmpty()) {while (tree != null) {stack.push(tree);tree = tree.left;}if (!stack.isEmpty()) {tree = stack.pop();System.out.println(tree.val);tree = tree.right;}}
}
后序遍历:
// 递归
public static void postOrder(TreeNode tree) {if (tree == null) return;postOrder(tree.left);postOrder(tree.right);System.out.println(tree.val);
}
// 非递归
public static void postOrder(TreeNode tree) {if (tree == null)return;Stack<TreeNode> s1 = new Stack<>();Stack<TreeNode> s2 = new Stack<>();s1.push(tree);while (!s1.isEmpty()) {tree = s1.pop();s2.push(tree);if (tree.left != null) {s1.push(tree.left);}if (tree.right != null) {s1.push(tree.right);}}while (!s2.isEmpty()) {System.out.print(s2.pop().val + " ");}
}public static void postOrder(TreeNode tree) {if (tree == null)return;Stack<TreeNode> stack = new Stack<>();stack.push(tree);TreeNode c;while (!stack.isEmpty()) {c = stack.peek();if (c.left != null && tree != c.left && tree != c.right) {stack.push(c.left);} else if (c.right != null && tree != c.right) {stack.push(c.right);} else {System.out.print(stack.pop().val + " ");tree = c;}}
}
BFS(广度优先搜索):
// 递归
public static void levelOrder(TreeNode tree) {int depth = depth(tree);for (int level = 0; level < depth; level++) {printLevel(tree, level);}
}private static int depth(TreeNode tree) {if (tree == null) return 0;int leftDepth = depth(tree.left);int rightDepth = depth(tree.right);return Math.max(leftDepth, rightDepth) + 1;
}private static void printLevel(TreeNode tree, int level) {if (tree == null) return;if (level == 0) {System.out.print(" " + tree.val);} else {printLevel(tree.left, level - 1);printLevel(tree.right, level - 1);}
}// 非递归
public static void levelOrder1(TreeNode tree) {if (tree == null) return;LinkedList<TreeNode> list = new LinkedList<>(); // 链表,可以把它看做队列list.add(tree); // 相当于把数据加入到队列尾部while (!list.isEmpty()) {TreeNode node = list.poll(); // poll方法相当于移除队列头部的元素System.out.println(node.val);if (node.left != null) list.add(node.left);if (node.right != null) list.add(node.right);}
}// 结果存放到list中
public static List<List<Integer>> levelOrder2(TreeNode tree) {if (tree == null)return null;List<List<Integer>> list = new ArrayList<>();bfs(tree, 0, list);return list;
}private static void bfs(TreeNode tree, int level, List<List<Integer>> list) {if (tree == null)return;if (level >= list.size()) {List<Integer> subList = new ArrayList<>();subList.add(tree.val);list.add(subList);} else {list.get(level).add(tree.val);}bfs(tree.left, level + 1, list);bfs(tree.right, level + 1, list);
}
DFS(深度优先搜索):
// 递归
public static void treeDFS(TreeNode root) {if (root == null) return;System.out.println(root.val);treeDFS(root.left);treeDFS(root.right);
}// 非递归
public static void treeDFS1(TreeNode root) {Stack<TreeNode> stack = new Stack<>();stack.add(root);while (!stack.empty()) {TreeNode node = stack.pop();System.out.println(node.val);if (node.right != null) {stack.push(node.right);}if (node.left != null) {stack.push(node.left);}}
}

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

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

相关文章

WIN32 桌面应用编程综合实验一学习记录

文章目录 引用传递和指针传递的区别和联系如何创建一个空的WINDOWS桌面项目C编程中函数声明、定义和链接的基本概念 引用传递和指针传递的区别和联系 case ID_SETTING_FONT:GetDrawFont(hWnd, gs_logFont, &gs_TextColor); break;logFont 和 pColor 的用法体现了 C 中两种…

stm32的规则采样与注入采样的理解

规则与注入转换 在STM32中&#xff0c;规则采样&#xff08;Regular Conversion&#xff09;和注入采样&#xff08;Injected Conversion&#xff09;是用于模数转换的两种不同模式。 规则采样&#xff08;Regular Conversion&#xff09;&#xff1a;规则采样是STM32中最常用…

面试算法105:最大的岛屿

题目 海洋岛屿地图可以用由0、1组成的二维数组表示&#xff0c;水平或竖直方向相连的一组1表示一个岛屿&#xff0c;请计算最大的岛屿的面积&#xff08;即岛屿中1的数目&#xff09;。例如&#xff0c;在下图中有4个岛屿&#xff0c;其中最大的岛屿的面积为5。 分析 将岛屿…

山东名岳轩印刷包装携专业包装袋盛装亮相2024济南生物发酵展

山东名岳轩印刷包装有限公司盛装亮相2024第12届国际生物发酵展&#xff0c;3月5-7日山东国际会展中心与您相约&#xff01; 展位号&#xff1a;1号馆F17 山东名岳轩印刷包装有限公司是一家拥有南北两个生产厂区&#xff0c;设计、制版、印刷&#xff0c;营销策划为一体的专业…

JavaSec基础 反射修改Final修饰的属性及绕过高版本反射限制

反射重拾 半年没碰java了 先写点基础回忆一下 反射弹计算器 public class Test {public static void main(String[] args) throws Exception {Class<?> clazz Class.forName("java.lang.Runtime");clazz.getDeclaredMethod("exec", String.cla…

springBoot-自动配置原理

以下笔记内容&#xff0c; 整理自B站黑马springBoot视频&#xff0c;抖音Holis 1、自动配置原理 1.收集Spring开发者的编程习惯&#xff0c;整理开发过程使用的常用技术列表一>(技术集A) 2.收集常用技术(技术集A)的使用参数&#xff0c;整理开发过程中每个技术的常用设置列表…

灵活轻巧的java接口自动化测试实战

前言 无论是自动化测试还是自动化部署&#xff0c;撸码肯定少不了&#xff0c;所以下面的基于java语言的接口自动化测试&#xff0c;要想在业务上实现接口自动化&#xff0c;前提是要有一定的java基础。 如果没有java基础&#xff0c;也没关系。这里小编也为大家提供了一套jav…

U盘、硬盘无法打开,修复RAW磁盘或分区,硬盘变成raw格式如何恢复,数据恢复

本文持续更新&#xff0c;针对遇到的数据丢失问题进行详细记录 磁盘变成RAW的可能原因 突然断电或关机文件系统丢失或损坏病毒或恶意软件感染坏扇区磁盘损坏 以下解决方案针对非病毒损坏 通过Windows自带的工具进行恢复&#xff08;CHKDSK命令&#xff09; 1.连接硬盘 2.…

springcloud bus消息总线

简介 Spring Cloud Bus 配合Spring Cloud Config 使用可以实现配置的动态刷新。 Spring Cloud Bus是用来将分布式系统的节点与轻量级消息系统链接起来的框架&#xff0c;它整合了Java的事件处理机制和消息中间件的功能。Spring Clud Bus目前支持RabbitMQ和Kafka。 Spring C…

TDengine 被 Frost Sullivan 评为全球最佳工业数据管理解决方案

近日&#xff0c;TDengine 被国际知名咨询公司沙利文&#xff08;Frost & Sullivan&#xff09;评为全球最佳工业数据管理解决方案&#xff0c;赢得了 2023 年客户价值领导力奖&#xff08;Frost & Sullivan duoxie&#xff09;&#xff0c;该奖项重点关注引领行业创新…

这些开源自动化测试框架,会用等于白嫖一个w

作者&#xff1a;黑马测试 链接&#xff1a;https://www.zhihu.com/question/19923336/answer/2585952461 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 随着计算机技术人员的大量增加&#xff0c;通过编写代码来…

设计模式——工厂方法模式(Factory Method Pattern)

简单工厂模式 概述 说工厂方法模式之前&#xff0c;先说下简单工厂模式&#xff0c;简单工厂模式并不属于GoF 23个经典设计模式&#xff0c;但通常将它作为学习其他工厂模式的基础&#xff0c;它的设计思想很简单&#xff0c;其基本流程如下&#xff1a;首先将需要创建的各种不…

顺序栈之共享栈实现——C语言

参考书&#xff1a;数据结构教程 第5版 李葆春 P83 #include <stdio.h> #include <string.h> #include <stdlib.h>#define MaxSize 10/*共享栈*/ typedef struct {char data[MaxSize];int top1,top2,len; }DStack;/*初始化*/ void InitStack(DStack *s){s-…

【Huggingface】如何访问Huggingface,Huggingface镜像

镜像站&#xff1a; https://hf-mirror.com/本站域名 hf-mirror.com&#xff0c;用于镜像 huggingface.co 域名。 更多用法&#xff08;多线程加速等&#xff09;详见这篇文章。简介&#xff1a; 方法一&#xff1a;使用huggingface 官方提供的 huggingface-cli 命令行工具。…

解决不同请求需要的同一实体类参数不同(分组校验validation)

问题概述 新增目录是自动生成id&#xff0c;不需要id参数&#xff1b;更新目录需要id&#xff0c;不能为空 pom.xml中已有spring-boot-starter-validation依赖 <!--validation(完成属性限制&#xff0c;参数校验)--><dependency><groupId>org.springframew…

“揭秘性能测试工具:优化软件性能的关键秘籍“

性能测试工具的设计宗旨是为了模拟用户对软件应用程序或系统的各种操作&#xff0c;旨在评估关键的性能指标&#xff0c;包括响应时间、吞吐量、并发能力和资源利用率。 通过这些工具模拟的多用户环境&#xff0c;我们能够产生与实际工作负载相似的条件&#xff0c;并监测系统…

业界首款PCIe 4.0/5.0多通道融合接口SSD技术解读

之前小编写过一篇文章劝大家不要碰PCIe 5.0 SSD&#xff0c;详细内容&#xff0c;可以再回顾下&#xff1a; 扩展阅读&#xff1a;当下最好不要入坑PCIe 5.0 SSD 如果想要进一步了解PCIe 6.0&#xff0c;欢迎点击阅读&#xff1a; 浅析PCIe 6.0功能更新与实现的挑战 PCIe 6.…

pyqt调用UI和开启子进程

UI制作 qrc 注意调用UI前把样式表里绑定的资源(qrc)转换成py导入进去 xxx.qrc转xxx.py 两种方法 1命令 pyrcc5 -o icons_rc.py icons.qrc 2外部工具pyrcc 实参 -o $FileNameWithoutExtension$.py $FileNameWithoutExtension$.qrcsdz.qrc→→sdaz.py 在代码里写 import…

Influxdb2修改管理员密码

通过恢复管理员令牌来重置InfluxDB2管理员的密码 1.找到数据库的配置文件 一般为config.json 2.配置文件的的blod文件配置 3.在这个混合文本和二进制json文件中搜索已知的用户名或token之类的字符串。 例如&#xff1a; "id":"0bd73badf2941000","…

AI-数学-高中-3.二次函数的根的分布问题的解题方法

原作者学习视频&#xff1a;二次】3二次函数根分布问题&#xff08;中档&#xff09;_哔哩哔哩_bilibili 一、伟达定理&#xff08;根与0比较的二次函数&#xff09; 示例&#xff1a; 二、画图法&#xff1a; 1.开口方向的确定&#xff0c;有的示例可能存在向上、下两种情况…