二叉树的创建及求树的高度

155 阅读1分钟
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; i < len(arr); {
		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))
}