type Node struct {
Val int
Left *Node
Right *Node
}
func InitTreeNode(val int) *Node {
return &Node{
Val: val,
Left: nil,
Right: nil,
}
}
//层序遍历创建二叉树
func buildTree(arr []int) *Node {
if len(arr) == 0 {
return nil
}
root := InitTreeNode(arr[0])
queue1 := []*Node{}
queue1 = append(queue1, root)
for i := 1
queue2 := []*Node{}
for len(queue1) > 0 {
curVal := queue1[0]
if i < len(arr) && arr[i] != -1 {
curVal.Left = InitTreeNode(arr[i])
queue2 = append(queue2, curVal.Left)
}
i++
if i < len(arr) && arr[i] != -1 {
curVal.Right = InitTreeNode(arr[i])
queue2 = append(queue2, curVal.Right)
}
i++
queue1 = queue1[1:len(queue1)]
}
queue1 = queue2
queue2 = []*Node{}
}
return root
}
//迭代后序遍历
func postOrder(root *Node) {
ret := []int{}
stack := []*Node{}
cur := root
var prev *Node
for cur != nil || len(stack) > 0 {
for cur != nil {
stack = append(stack, cur)
cur = cur.Left
}
top := stack[len(stack) - 1]
if (top.Left == nil && top.Right == nil) || (prev == top.Left && top.Right == nil) || prev == top.Right {
ret = append(ret, top.Val)
stack = stack[0:len(stack)-1]
prev = top
} else {
cur = top.Right
}
}
}
func levelOrder(root *Node) [][]int {
ret := make([][]int, 0)
if root == nil {
return ret
}
stack1 := make([]*Node, 0)
stack2 := make([]*Node, 0)
stack1 = append(stack1, root)
for len(stack1) > 0 {
tmp := make([]int, 0)
for len(stack1) > 0 {
tmp = append(tmp, stack1[0].Val)
if stack1[0].Left != nil {
stack2 = append(stack2, stack1[0].Left)
}
if stack1[0].Right != nil {
stack2 = append(stack2, stack1[0].Right)
}
stack1 = stack1[1:]
}
ret = append(ret, tmp)
stack1 = stack2
stack2 = []*Node{}
}
return ret
}
func getHight1(root *Node) int{
if root == nil {
return 0
}
leftHight := getHight1(root.Left)
rightHight := getHight1(root.Right)
if leftHight > rightHight {
return leftHight + 1
}
return rightHight + 1
}
func getHight2(root *Node) int {
if root == nil {
return 0
}
stack1 := make([]*Node, 0)
stack2 := make([]*Node, 0)
stack1 = append(stack1, root)
hight := 0
for len(stack1) > 0 {
hight++
tmp := make([]int, 0)
for len(stack1) > 0 {
tmp = append(tmp, stack1[0].Val)
if stack1[0].Left != nil {
stack2 = append(stack2, stack1[0].Left)
}
if stack1[0].Right != nil {
stack2 = append(stack2, stack1[0].Right)
}
stack1 = stack1[1:]
}
stack1 = stack2
stack2 = []*Node{}
}
return hight
}
func main() {
arr := []int{1,2,3,5,8,-1,10,-1,-1,7,-1,9,-1,-1,6,-1,-1,14}
root := buildTree(arr)
fmt.Println(levelOrder(root))
fmt.Println(getHight1(root))
fmt.Println(getHight2(root))
}