二叉树算法题

package code

import (
	"fmt"
	"math"
)

//无实际意义、讲其他操作绑定到一起而已
type BinaryTree struct {

}

//前序遍历
//前序遍历的顺序是  根 -----> 左子树 -----> 右子树
//中序遍历
//中序遍历的顺序是 左子树 -----> 根 ------> 右子树
//后序遍历
//后序遍历的顺序是 左子树 -----> 右子树 -----> 根

type TreeNode struct {
	Val   interface{}
	Left  *TreeNode
	Right *TreeNode
}

// 将类似[]interface{}{1, 2, 3, nil, nil, 4, 5}的数组转换成相应的Binary Tree节点
func (this *BinaryTree) TreeFromNullableArray(data []interface{}) *TreeNode {
	if len(data) == 0 {
		return nil
	}
	root := &TreeNode{}
	switch t := data[0].(type) {
	case int:
		root.Val = t
	case nil:
		return nil
	default:
		panic("Unknown element type")
	}

	queue := make([]*TreeNode, 1)
	queue[0] = root

	data = data[1:]
	for len(data) > 0 && len(queue) > 0 {
		node := queue[0]
		queue = queue[1:]

		// 左侧节点
		node.Left = this.newNodeFromData(data[0])
		if node.Left != nil {
			queue = append(queue, node.Left)
		}
		data = data[1:]

		// 右侧节点
		if len(data) > 0 {
			node.Right = this.newNodeFromData(data[0])
			if node.Right != nil {
				queue = append(queue, node.Right)
			}
			data = data[1:]
		}
	}
	return root
}

// 根据数据来创建一个新的节点
func (this *BinaryTree) newNodeFromData(val interface{}) *TreeNode {
	switch t := val.(type) {
	case int:
		return &TreeNode{Val: t}
	case nil:
		return nil
	default:
		panic("Unknown element type")
	}
}

// 前序遍历 根 ---> 左 --->右
func (self *BinaryTree) PreorderTraverse(node *TreeNode) {
	if node == nil {
		return
	} else {
		fmt.Print(node.Val, " ")
		self.PreorderTraverse(node.Left)
		self.PreorderTraverse(node.Right)
	}

}

// 中序遍历 左 ---> 根 --->右
func (self *BinaryTree) InorderTraverse(node *TreeNode) {
	if node == nil {
		return
	} else {
		self.InorderTraverse(node.Left)
		fmt.Print(node.Val, " ")
		self.InorderTraverse(node.Right)

	}
}

// 后序遍历 左 ----> 右 ---> 根
func (self *BinaryTree) PostTraverse(node *TreeNode) {
	if node == nil {
		return
	} else {
		self.PostTraverse(node.Left)
		self.PostTraverse(node.Right)
		fmt.Print(node.Val, " ")
	}
}

//  求 K 层节点个数
func (this *BinaryTree) GetKthNum(root *TreeNode, k int) int {
	if root == nil {
		return 0
	}
	if k == 1 {
		return 1
	}
	return this.GetKthNum(root.Left, k-1) + this.GetKthNum(root.Right, k-1)
}

// 求叶子节点个数
func (this *BinaryTree) GetLeavNum(root *TreeNode) int {
	if root == nil {
		return 0
	}
	if root.Left == nil && root.Right == nil {
		return 1
	}
	return this.GetLeavNum(root.Left) + this.GetLeavNum(root.Right)
}

// 计算二叉树节点个数
func (this *BinaryTree) GetNodeNum(root *TreeNode) int {
	if root == nil {
		return 0
	} else {
		return this.GetNodeNum(root.Left) + this.GetNodeNum(root.Right) + 1
	}
}

// 计算二叉树的深度
func (this *BinaryTree) GetDegree(root *TreeNode) int {
	if root == nil {
		return 0
	}
	var maxDegree = 0
	if this.GetDegree(root.Left) > this.GetDegree(root.Right) {
		maxDegree = this.GetDegree(root.Left)
	} else {
		maxDegree = this.GetDegree(root.Right)
	}
	return maxDegree + 1
}

// 判断是否平衡二叉树
func (this *BinaryTree) IsBalanced(root *TreeNode) bool {
	if root == nil {
		return true
	}
	lde := this.GetDegree(root.Left)
	rde := this.GetDegree(root.Right)
	flag := false
	if (math.Abs(float64(lde - rde))) <= 1 {
		flag = true
	} else {
		flag = false
	}
	return flag && this.IsBalanced(root.Left) && this.IsBalanced(root.Right)
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值