当前位置:网站首页>golang 刷leetcode:Morris 遍历
golang 刷leetcode:Morris 遍历
2022-08-02 20:36:00 【用户9710217】
给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。
示例 1:
输入:root = [1,null,2,3]
输出:[1,3,2]
示例 2:
输入:root = []
输出:[]
示例 3:
输入:root = [1]
输出:[1]
提示:
树中节点数目在范围 [0, 100] 内
-100 <= Node.val <= 100
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
空间复杂度O(1)完成中序遍历Morries遍历
过程:
1,如果左孩子非空,让左孩子的最右节点指向根节点得到左孩子的最右节点
2,如果最右节点的右孩子节点是null,说明是第一次遍历,把它的右孩子指向根节点
3,如果最右节点的右孩子是当前节点,说明,是第二次遍历,把最右节点的右孩子指向空,即还原树
4,如果左孩子为空,将当前节点移动到右节点。
5,左孩子为空父亲节点遍历一次,第一就取值,左孩子非空由于会遍历父亲节点两次,所以第二次到达父亲节点的时候取值,就实现了中序遍历。
实现:
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func inorderTraversal(root *TreeNode) []int {
var r[]int
for root!=nil{
if root.Left!=nil{
pre:=root.Left
for pre.Right!=nil && pre.Right!=root{
pre=pre.Right
}
if pre.Right==nil{
pre.Right=root
root=root.Left
}else{
pre.Right=nil
r=append(r,root.Val)
root=root.Right
}
}else{
r=append(r,root.Val)
root=root.Right
}
}
return r
}
同理先序遍历,就是第一次到达父亲节点的时候取值
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func preorderTraversal(root *TreeNode) []int {
var r[]int
for root!=nil{
if root.Left!=nil{
pre:=root.Left
for pre.Right!=nil && pre.Right!=root{
pre=pre.Right
}
if pre.Right==nil{
r=append(r,root.Val)
pre.Right=root
root=root.Left
}else{
pre.Right=nil
root=root.Right
}
}else{
r=append(r,root.Val)
root=root.Right
}
}
return r
}
后序序遍历,需要在第二次到达父亲节点的时候,逆序保存,最右孩子到父亲节点的值,遍历完后,需要保存从根节点到最右孩子的逆序:
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func postorderTraversal(root *TreeNode) []int {
var r[]int
tmp:=root
for root!=nil{
if root.Left!=nil{
pre:=root.Left
for pre.Right!=nil && pre.Right!=root{
pre=pre.Right
}
if pre.Right==nil{
pre.Right=root
root=root.Left
}else{
pre.Right=nil
rv:=reverse(root.Left)
for rv!=nil{
r=append(r,rv.Val)
rv=rv.Right
}
reverse(rv)
root=root.Right
}
}else{
root=root.Right
}
}
rv:=reverse(tmp)
for rv!=nil{
r=append(r,rv.Val)
rv=rv.Right
}
reverse(rv)
return r
}
func reverse(root *TreeNode) *TreeNode{
if root==nil{
return nil
}
next:=root.Right
root.Right=nil
for next!=nil{
tmp:=next.Right
next.Right=root
root=next
next=tmp
}
return root
}
边栏推荐
猜你喜欢
广东省数字经济发展指引 1.0之建成数据安全保障体系
Packages and packages, access modifiers
汇编语言中b和bl关键字的区别
Qt提升自定义控件,找不到头文件
Informatics Olympiad All-in-One (1259: [Example 9.3] Find the longest non-descending sequence)
千人优学 | GBase 8s数据库2022年6月大学生专场实训圆满结束
Wiring diagrams of switches, motors, circuit breakers, thermocouples, and meters
"Weekly Translate Go" This time we have something different!-- "How to Code in Go" series launched
Adobe官方清理工具Adobe Creative Cloud Cleaner Tool使用教程
框架设计:PC 端单页多页框架如何设计与落地
随机推荐
李沐动手学深度学习V2-bert预训练数据集和代码实现
js如何获取浏览器缩放比例
你是几星测试/开发程序员?技术型选手王大拿......
传感器工作原理
Wiring diagrams of switches, motors, circuit breakers, thermocouples, and meters
包管理工具npm- node package management相关知识 、检查包更新、NPM包上传、更换镜像、npm ERR! registry error parsing json
数字孪生助力智慧城市可视化建设
美国爱荷华州立大学| Improving Distantly Supervised Relation Extraction by Natural Language Inference(通过自然语言推理改进远程监督关系提取)
有效解决MySQL报错:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: NO/YES)
Golang source code analysis: juju/ratelimit
SQL基础练习题(mysql)
14、学习MySQL 连接的使用
并发与并行
Xcode13.1运行工程报错fatal error: ‘IFlyMSC/IFly.h‘ file not found的问题
Geoip2 - golang golang source code analysis
Details in C# you don't know
二叉搜索树的实现
DataGrip 安装教程 详细版
[21 Days Learning Challenge] Bubble Sort and Insertion Sort
软件成分分析:华为云重磅发布开源软件治理服务