package main
import "fmt"
// Node represents a tree node
type Node struct {
val int
children []*Node
}
// height returns the height of the node
func height(node *Node) int {
if node == nil || len(node.children) == 0 {
return 0 // leaf node height is 0
}
maxHeight := 0
for _, child := range node.children {
h := height(child) // recursive height of child
if h > maxHeight {
maxHeight = h
}
}
return maxHeight + 1 // add 1 for current node
}
// depthMap stores depth of each node
func depthMap(node *Node, depth int, depths map[int]int) {
if node == nil {
return
}
depths[node.val] = depth // record depth
for _, child := range node.children {
depthMap(child, depth+1, depths) // recurse with depth+1
}
}
// findLeaves collects leaf nodes
func findLeaves(node *Node, leaves *[]int) {
if node == nil {
return
}
if len(node.children) == 0 {
*leaves = append(*leaves, node.val) // leaf found
return
}
for _, child := range node.children {
findLeaves(child, leaves)
}
}
func main() {
// Build tree:
// 1
// ├─ 2
// │ └─ 4
// └─ 3
n4 := &Node{val: 4}
n3 := &Node{val: 3}
n2 := &Node{val: 2, children: []*Node{n4}}
root := &Node{val: 1, children: []*Node{n2, n3}}
// Root
fmt.Println("Root:", root.val)
// Leaves
leaves := []int{}
findLeaves(root, &leaves)
fmt.Println("Leaves:", leaves)
// Depths
depths := map[int]int{}
depthMap(root, 0, depths)
fmt.Println("Depths:")
for k, v := range depths {
fmt.Printf("Node %d: %d\n", k, v)
}
// Heights
fmt.Println("Heights:")
nodes := []*Node{root, n2, n3, n4}
for _, n := range nodes {
h := height(n)
fmt.Printf("Node %d: %d\n", n.val, h)
}
// Levels (same as depth)
fmt.Println("Levels:")
for k, v := range depths {
fmt.Printf("Node %d: %d\n", k, v)
}
}if node == nil || len(node.children) == 0 { return 0 }
Return 0 height for leaf or empty node
for _, child := range node.children { h := height(child); if h > maxHeight { maxHeight = h } }
Find max height among children
Record current node depth
for _, child := range node.children { depthMap(child, depth+1, depths) }
Recurse to children with increased depth
if len(node.children) == 0 { *leaves = append(*leaves, node.val); return }
Add node to leaves if no children
Root: 1
Leaves: [4 3]
Depths:
Node 1: 0
Node 2: 1
Node 3: 1
Node 4: 2
Heights:
Node 1: 2
Node 2: 1
Node 3: 0
Node 4: 0
Levels:
Node 1: 0
Node 2: 1
Node 3: 1
Node 4: 2