mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-09 19:44:45 +08:00
@ -836,6 +836,249 @@ func levelOrder(root *TreeNode) [][]int {
|
|||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
> 二叉树的层序遍历(GO语言完全版)
|
||||||
|
|
||||||
|
```go
|
||||||
|
/**
|
||||||
|
102. 二叉树的层序遍历
|
||||||
|
*/
|
||||||
|
func levelOrder(root *TreeNode) [][]int {
|
||||||
|
res:=[][]int{}
|
||||||
|
if root==nil{//防止为空
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
queue:=list.New()
|
||||||
|
queue.PushBack(root)
|
||||||
|
var tmpArr []int
|
||||||
|
for queue.Len()>0 {
|
||||||
|
length:=queue.Len()//保存当前层的长度,然后处理当前层(十分重要,防止添加下层元素影响判断层中元素的个数)
|
||||||
|
for i:=0;i<length;i++{
|
||||||
|
node:=queue.Remove(queue.Front()).(*TreeNode)//出队列
|
||||||
|
if node.Left!=nil{
|
||||||
|
queue.PushBack(node.Left)
|
||||||
|
}
|
||||||
|
if node.Right!=nil{
|
||||||
|
queue.PushBack(node.Right)
|
||||||
|
}
|
||||||
|
tmpArr=append(tmpArr,node.Val)//将值加入本层切片中
|
||||||
|
}
|
||||||
|
res=append(res,tmpArr)//放入结果集
|
||||||
|
tmpArr=[]int{}//清空层的数据
|
||||||
|
}
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
107. 二叉树的层序遍历 II
|
||||||
|
*/
|
||||||
|
func levelOrderBottom(root *TreeNode) [][]int {
|
||||||
|
queue:=list.New()
|
||||||
|
res:=[][]int{}
|
||||||
|
if root==nil{
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
queue.PushBack(root)
|
||||||
|
for queue.Len()>0{
|
||||||
|
length:=queue.Len()
|
||||||
|
tmp:=[]int{}
|
||||||
|
for i:=0;i<length;i++{
|
||||||
|
node:=queue.Remove(queue.Front()).(*TreeNode)
|
||||||
|
if node.Left!=nil{
|
||||||
|
queue.PushBack(node.Left)
|
||||||
|
}
|
||||||
|
if node.Right!=nil{
|
||||||
|
queue.PushBack(node.Right)
|
||||||
|
}
|
||||||
|
tmp=append(tmp,node.Val)
|
||||||
|
}
|
||||||
|
res=append(res,tmp)
|
||||||
|
}
|
||||||
|
//反转结果集
|
||||||
|
for i:=0;i<len(res)/2;i++{
|
||||||
|
res[i],res[len(res)-i-1]=res[len(res)-i-1],res[i]
|
||||||
|
}
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
199. 二叉树的右视图
|
||||||
|
*/
|
||||||
|
func rightSideView(root *TreeNode) []int {
|
||||||
|
queue:=list.New()
|
||||||
|
res:=[][]int{}
|
||||||
|
var finaRes []int
|
||||||
|
if root==nil{
|
||||||
|
return finaRes
|
||||||
|
}
|
||||||
|
queue.PushBack(root)
|
||||||
|
for queue.Len()>0{
|
||||||
|
length:=queue.Len()
|
||||||
|
tmp:=[]int{}
|
||||||
|
for i:=0;i<length;i++{
|
||||||
|
node:=queue.Remove(queue.Front()).(*TreeNode)
|
||||||
|
if node.Left!=nil{
|
||||||
|
queue.PushBack(node.Left)
|
||||||
|
}
|
||||||
|
if node.Right!=nil{
|
||||||
|
queue.PushBack(node.Right)
|
||||||
|
}
|
||||||
|
tmp=append(tmp,node.Val)
|
||||||
|
}
|
||||||
|
res=append(res,tmp)
|
||||||
|
}
|
||||||
|
//取每一层的最后一个元素
|
||||||
|
for i:=0;i<len(res);i++{
|
||||||
|
finaRes=append(finaRes,res[i][len(res[i])-1])
|
||||||
|
}
|
||||||
|
return finaRes
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
637. 二叉树的层平均值
|
||||||
|
*/
|
||||||
|
func averageOfLevels(root *TreeNode) []float64 {
|
||||||
|
res:=[][]int{}
|
||||||
|
var finRes []float64
|
||||||
|
if root==nil{//防止为空
|
||||||
|
return finRes
|
||||||
|
}
|
||||||
|
queue:=list.New()
|
||||||
|
queue.PushBack(root)
|
||||||
|
var tmpArr []int
|
||||||
|
for queue.Len()>0 {
|
||||||
|
length:=queue.Len()//保存当前层的长度,然后处理当前层(十分重要,防止添加下层元素影响判断层中元素的个数)
|
||||||
|
for i:=0;i<length;i++{
|
||||||
|
node:=queue.Remove(queue.Front()).(*TreeNode)//出队列
|
||||||
|
if node.Left!=nil{
|
||||||
|
queue.PushBack(node.Left)
|
||||||
|
}
|
||||||
|
if node.Right!=nil{
|
||||||
|
queue.PushBack(node.Right)
|
||||||
|
}
|
||||||
|
tmpArr=append(tmpArr,node.Val)//将值加入本层切片中
|
||||||
|
}
|
||||||
|
res=append(res,tmpArr)//放入结果集
|
||||||
|
tmpArr=[]int{}//清空层的数据
|
||||||
|
}
|
||||||
|
//计算每层的平均值
|
||||||
|
length:=len(res)
|
||||||
|
for i:=0;i<length;i++{
|
||||||
|
var sum int
|
||||||
|
for j:=0;j<len(res[i]);j++{
|
||||||
|
sum+=res[i][j]
|
||||||
|
}
|
||||||
|
tmp:=float64(sum)/float64(len(res[i]))
|
||||||
|
finRes=append(finRes,tmp)//将平均值放入结果集合
|
||||||
|
}
|
||||||
|
return finRes
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
429. N 叉树的层序遍历
|
||||||
|
*/
|
||||||
|
|
||||||
|
func levelOrder(root *Node) [][]int {
|
||||||
|
queue:=list.New()
|
||||||
|
res:=[][]int{}//结果集
|
||||||
|
if root==nil{
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
queue.PushBack(root)
|
||||||
|
for queue.Len()>0{
|
||||||
|
length:=queue.Len()//记录当前层的数量
|
||||||
|
var tmp []int
|
||||||
|
for T:=0;T<length;T++{//该层的每个元素:一添加到该层的结果集中;二找到该元素的下层元素加入到队列中,方便下次使用
|
||||||
|
myNode:=queue.Remove(queue.Front()).(*Node)
|
||||||
|
tmp=append(tmp,myNode.Val)
|
||||||
|
for i:=0;i<len(myNode.Children);i++{
|
||||||
|
queue.PushBack(myNode.Children[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
res=append(res,tmp)
|
||||||
|
}
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
515. 在每个树行中找最大值
|
||||||
|
*/
|
||||||
|
func largestValues(root *TreeNode) []int {
|
||||||
|
res:=[][]int{}
|
||||||
|
var finRes []int
|
||||||
|
if root==nil{//防止为空
|
||||||
|
return finRes
|
||||||
|
}
|
||||||
|
queue:=list.New()
|
||||||
|
queue.PushBack(root)
|
||||||
|
var tmpArr []int
|
||||||
|
//层次遍历
|
||||||
|
for queue.Len()>0 {
|
||||||
|
length:=queue.Len()//保存当前层的长度,然后处理当前层(十分重要,防止添加下层元素影响判断层中元素的个数)
|
||||||
|
for i:=0;i<length;i++{
|
||||||
|
node:=queue.Remove(queue.Front()).(*TreeNode)//出队列
|
||||||
|
if node.Left!=nil{
|
||||||
|
queue.PushBack(node.Left)
|
||||||
|
}
|
||||||
|
if node.Right!=nil{
|
||||||
|
queue.PushBack(node.Right)
|
||||||
|
}
|
||||||
|
tmpArr=append(tmpArr,node.Val)//将值加入本层切片中
|
||||||
|
}
|
||||||
|
res=append(res,tmpArr)//放入结果集
|
||||||
|
tmpArr=[]int{}//清空层的数据
|
||||||
|
}
|
||||||
|
//找到每层的最大值
|
||||||
|
for i:=0;i<len(res);i++{
|
||||||
|
finRes=append(finRes,max(res[i]...))
|
||||||
|
}
|
||||||
|
return finRes
|
||||||
|
}
|
||||||
|
func max(vals...int) int {
|
||||||
|
max:=int(math.Inf(-1))//负无穷
|
||||||
|
for _, val := range vals {
|
||||||
|
if val > max {
|
||||||
|
max = val
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return max
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
116. 填充每个节点的下一个右侧节点指针
|
||||||
|
117. 填充每个节点的下一个右侧节点指针 II
|
||||||
|
*/
|
||||||
|
|
||||||
|
func connect(root *Node) *Node {
|
||||||
|
res:=[][]*Node{}
|
||||||
|
if root==nil{//防止为空
|
||||||
|
return root
|
||||||
|
}
|
||||||
|
queue:=list.New()
|
||||||
|
queue.PushBack(root)
|
||||||
|
var tmpArr []*Node
|
||||||
|
for queue.Len()>0 {
|
||||||
|
length:=queue.Len()//保存当前层的长度,然后处理当前层(十分重要,防止添加下层元素影响判断层中元素的个数)
|
||||||
|
for i:=0;i<length;i++{
|
||||||
|
node:=queue.Remove(queue.Front()).(*Node)//出队列
|
||||||
|
if node.Left!=nil{
|
||||||
|
queue.PushBack(node.Left)
|
||||||
|
}
|
||||||
|
if node.Right!=nil{
|
||||||
|
queue.PushBack(node.Right)
|
||||||
|
}
|
||||||
|
tmpArr=append(tmpArr,node)//将值加入本层切片中
|
||||||
|
}
|
||||||
|
res=append(res,tmpArr)//放入结果集
|
||||||
|
tmpArr=[]*Node{}//清空层的数据
|
||||||
|
}
|
||||||
|
//遍历每层元素,指定next
|
||||||
|
for i:=0;i<len(res);i++{
|
||||||
|
for j:=0;j<len(res[i])-1;j++{
|
||||||
|
res[i][j].Next=res[i][j+1]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return root
|
||||||
|
}
|
||||||
|
```
|
||||||
Javascript:
|
Javascript:
|
||||||
```javascript
|
```javascript
|
||||||
var levelOrder = function (root) {
|
var levelOrder = function (root) {
|
||||||
|
Reference in New Issue
Block a user