当前位置:网站首页>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
}
边栏推荐
- 如何成为一名正义黑客?你应该学习什么?
- [21 Days Learning Challenge] Bubble Sort and Insertion Sort
- PyRosetta 安装方法之Conda安装
- ACE JET NPOI
- js如何获取浏览器缩放比例
- y85.第四章 Prometheus大厂监控体系及实战 -- prometheus告警机制进阶、pushgateway和prometheus存储(十六)
- 汉源高科2光12电千兆导轨式网管型工业以太网交换机双光自愈保护式以太网光交换机
- Solve the docker mysql can't write Chinese
- 什么是 IDE
- The time series database has been developed for 5 years. What problem does it need to solve?
猜你喜欢
KDD 2022 | 深度图神经网络中的特征过相关:一个新视角
The software testing process specification is what?Specific what to do?
千人优学 | GBase 8s数据库2022年6月大学生专场实训圆满结束
.NET性能优化-你应该为集合类型设置初始大小
PyRosetta 安装方法之Conda安装
软件测试的流程规范有哪些?具体要怎么做?
WPF development through practical 】 【 automatic production management platform
如何成为一名正义黑客?你应该学习什么?
【流媒体】推流与拉流简介
框架设计:PC 端单页多页框架如何设计与落地
随机推荐
正则表达式
14、学习MySQL 连接的使用
博客主页rrs代码
解道8-编程技术5
sre成长之路
封装和包、访问修饰权限
你是几星测试/开发程序员?技术型选手王大拿......
【3D视觉】realsense D435三维重建
.NET performance optimization - you should set initial size for collection types
如何理解 swing 是非线程安全 (原创)
汇编语言中b和bl关键字的区别
OP-5,输入/输出信号范围-一信号处理能力
引用类型 ,值类型 ,小坑。
什么是 IDE
接口测试常用工具及测试方法(入门篇)
MSTP与STP
【模型压缩】实例分析量化原理
.NET性能优化-你应该为集合类型设置初始大小
ABAP grammar small review
「每周译Go」这次我们来点不一样的!--《How to Code in Go》系列上线