当前位置:网站首页>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
}边栏推荐
- Informatics Olympiad All-in-One (1259: [Example 9.3] Find the longest non-descending sequence)
- How the sensor works
- .NET如何快速比较两个byte数组是否相等
- PLC工作原理动画
- Nervegrowold hands-on learning deep learning V2 - Bert pre training data set and code implementation
- V - memo new instructions
- 用户之声 | GBASE南大通用实训有感
- 美国爱荷华州立大学| Improving Distantly Supervised Relation Extraction by Natural Language Inference(通过自然语言推理改进远程监督关系提取)
- 有效解决MySQL报错:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: NO/YES)
- 【模型压缩】实例分析量化原理
猜你喜欢
随机推荐
sre成长之路
人尽皆知的云原生,到底是大势所趋还是过度炒作?
千人优学 | GBase 8s数据库2022年6月大学生专场实训圆满结束
go——内存分配机制
信息学奥赛一本通(1260:【例9.4】拦截导弹(Noip1999))
解道8-编程技术5
C# Monitor类
Which thread pool does Async use?
Likou Question of the Day - Day 46 - 344. Reverse Strings
JMeter的基本使用
信息学奥赛一本通(1256:献给阿尔吉侬的花束)
【模型压缩】实例分析量化原理
iframe------------frame-
setup syntax sugar defineProps defineEmits defineExpose
开关、电机、断路器、电热偶、电表接线图大全
奥特学园ROS笔记--7(289-325节)
Golang source code analysis: time/rate
华为设备配置BFD多跳检测
KDD 2022 | 深度图神经网络中的特征过相关:一个新视角
一次线上事故,我顿悟了异步的精髓








