计算满三叉树的节点数

665 阅读1分钟

偶尔想到的一个问题,顺手写了一下解决方法。

具体实现

// 三叉树节点
type TripleTreeNode struct {
	Val    int
	Left   *TripleTreeNode
	Middle *TripleTreeNode
	Right  *TripleTreeNode
}

// 获取满三叉树的节点数
func getNodeCountOfFullTripleTree(root *TripleTreeNode) int64 {
	d := getDepthOfFullTripleTree(root)
	return getPowerOfN(3, int64(d)) / 2
}

// 获取满三叉树的深度。
// 空树深度是0。
// 只有根节点时,深度是1。
func getDepthOfFullTripleTree(root *TripleTreeNode) int {
	var d int
	curr := root
	for curr != nil {
		d++
		curr = curr.Left
	}
	return d
}

// 计算x的n次幂
// 输入要保证n>=1
func getPowerOfN(x, n int64) int64 {
	if n <= 0 {
		return 0
	}
	switch n {
	case 5:
		return x * x * x * x * x
	case 4:
		return x * x * x * x
	case 3:
		return x * x * x
	case 2:
		return x * x
	case 1:
		return x
	}
	if n&1 != 0 {
		y := getPowerOfN(x, n/2)
		return y * y * x
	}
	y := getPowerOfN(x, n/2)
	return y * y
}

测试代码

package main

import (
	"fmt"
	"math/rand"
	"time"
)

func main() {
	fmt.Println("Hello, playground")
	rand.Seed(time.Now().UnixNano())

	root := &TripleTreeNode{
		Val: 1,
	}
	maxDepth := 3
	AddChildren(root, maxDepth)
	fmt.Println(getNodeCountOfFullTripleTree(root))
}

func AddChildren(root *TripleTreeNode, depth int) {
	depth--
	if depth <= 0 {
		return
	}
	root.Left = &TripleTreeNode{
		Val: rand.Intn(1e5),
	}
	root.Middle = &TripleTreeNode{
		Val: rand.Intn(1e5),
	}
	root.Right = &TripleTreeNode{
		Val: rand.Intn(1e5),
	}
	AddChildren(root.Left, depth)
	AddChildren(root.Middle, depth)
	AddChildren(root.Right, depth)
}