mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-10 04:06:51 +08:00
添加 二叉树的统一迭代法 GO版本
添加 二叉树的统一迭代法 GO版本
This commit is contained in:
@ -242,7 +242,137 @@ Python:
|
|||||||
|
|
||||||
|
|
||||||
Go:
|
Go:
|
||||||
|
> 前序遍历统一迭代法
|
||||||
|
|
||||||
|
```GO
|
||||||
|
/**
|
||||||
|
type Element struct {
|
||||||
|
// 元素保管的值
|
||||||
|
Value interface{}
|
||||||
|
// 内含隐藏或非导出字段
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *List) Back() *Element
|
||||||
|
前序遍历:中左右
|
||||||
|
压栈顺序:右左中
|
||||||
|
**/
|
||||||
|
func preorderTraversal(root *TreeNode) []int {
|
||||||
|
if root == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
var stack = list.New()//栈
|
||||||
|
res:=[]int{}//结果集
|
||||||
|
stack.PushBack(root)
|
||||||
|
var node *TreeNode
|
||||||
|
for stack.Len()>0{
|
||||||
|
e := stack.Back()
|
||||||
|
stack.Remove(e)//弹出元素
|
||||||
|
if e.Value==nil{// 如果为空,则表明是需要处理中间节点
|
||||||
|
e=stack.Back()//弹出元素(即中间节点)
|
||||||
|
stack.Remove(e)//删除中间节点
|
||||||
|
node=e.Value.(*TreeNode)
|
||||||
|
res=append(res,node.Val)//将中间节点加入到结果集中
|
||||||
|
continue//继续弹出栈中下一个节点
|
||||||
|
}
|
||||||
|
node = e.Value.(*TreeNode)
|
||||||
|
//压栈顺序:右左中
|
||||||
|
if node.Right!=nil{
|
||||||
|
stack.PushBack(node.Right)
|
||||||
|
}
|
||||||
|
if node.Left!=nil{
|
||||||
|
stack.PushBack(node.Left)
|
||||||
|
}
|
||||||
|
stack.PushBack(node)//中间节点压栈后再压入nil作为中间节点的标志符
|
||||||
|
stack.PushBack(nil)
|
||||||
|
}
|
||||||
|
return res
|
||||||
|
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
> 中序遍历统一迭代法
|
||||||
|
|
||||||
|
```go
|
||||||
|
/**
|
||||||
|
* Definition for a binary tree node.
|
||||||
|
* type TreeNode struct {
|
||||||
|
* Val int
|
||||||
|
* Left *TreeNode
|
||||||
|
* Right *TreeNode
|
||||||
|
* }
|
||||||
|
*/
|
||||||
|
//中序遍历:左中右
|
||||||
|
//压栈顺序:右中左
|
||||||
|
func inorderTraversal(root *TreeNode) []int {
|
||||||
|
if root==nil{
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
stack:=list.New()//栈
|
||||||
|
res:=[]int{}//结果集
|
||||||
|
stack.PushBack(root)
|
||||||
|
var node *TreeNode
|
||||||
|
for stack.Len()>0{
|
||||||
|
e := stack.Back()
|
||||||
|
stack.Remove(e)
|
||||||
|
if e.Value==nil{// 如果为空,则表明是需要处理中间节点
|
||||||
|
e=stack.Back()//弹出元素(即中间节点)
|
||||||
|
stack.Remove(e)//删除中间节点
|
||||||
|
node=e.Value.(*TreeNode)
|
||||||
|
res=append(res,node.Val)//将中间节点加入到结果集中
|
||||||
|
continue//继续弹出栈中下一个节点
|
||||||
|
}
|
||||||
|
node = e.Value.(*TreeNode)
|
||||||
|
//压栈顺序:右中左
|
||||||
|
if node.Right!=nil{
|
||||||
|
stack.PushBack(node.Right)
|
||||||
|
}
|
||||||
|
stack.PushBack(node)//中间节点压栈后再压入nil作为中间节点的标志符
|
||||||
|
stack.PushBack(nil)
|
||||||
|
if node.Left!=nil{
|
||||||
|
stack.PushBack(node.Left)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
> 后序遍历统一迭代法
|
||||||
|
|
||||||
|
```go
|
||||||
|
//后续遍历:左右中
|
||||||
|
//压栈顺序:中右左
|
||||||
|
func postorderTraversal(root *TreeNode) []int {
|
||||||
|
if root == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
var stack = list.New()//栈
|
||||||
|
res:=[]int{}//结果集
|
||||||
|
stack.PushBack(root)
|
||||||
|
var node *TreeNode
|
||||||
|
for stack.Len()>0{
|
||||||
|
e := stack.Back()
|
||||||
|
stack.Remove(e)
|
||||||
|
if e.Value==nil{// 如果为空,则表明是需要处理中间节点
|
||||||
|
e=stack.Back()//弹出元素(即中间节点)
|
||||||
|
stack.Remove(e)//删除中间节点
|
||||||
|
node=e.Value.(*TreeNode)
|
||||||
|
res=append(res,node.Val)//将中间节点加入到结果集中
|
||||||
|
continue//继续弹出栈中下一个节点
|
||||||
|
}
|
||||||
|
node = e.Value.(*TreeNode)
|
||||||
|
//压栈顺序:中右左
|
||||||
|
stack.PushBack(node)//中间节点压栈后再压入nil作为中间节点的标志符
|
||||||
|
stack.PushBack(nil)
|
||||||
|
if node.Right!=nil{
|
||||||
|
stack.PushBack(node.Right)
|
||||||
|
}
|
||||||
|
if node.Left!=nil{
|
||||||
|
stack.PushBack(node.Left)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user