Diameter of the tree is defined as a long path or route, between any two nodes in a tree. The path may or may not goes through the ROOT.
Print the Longest leaf to leaf path in a binary tree and its length
I worth an algorithm that calculates the diameter in Swift:
func diameter() -> Int {
return diameterHelper(root).Diameter
}
typealias HeightAndDiameter = (Height: Int, Diameter: Int)
private func diameterHelper(node: TreeNode<T>?) -> HeightAndDiameter {
guard let node = node else {
return HeightAndDiameter(Height:0, Diameter:0)
}
let left = diameterHelper(node.left)
let right = diameterHelper(node.right)
let height = max(left.Height, right.Height) + 1
let diameter = max(left.Height + right.Height + 1, max(left.Diameter, right.Diameter))
return HeightAndDiameter(Height: height, Diameter: diameter)
}
I have tried to adapt this algorithm, but it doesn't work for all the cases.
func diameterPath() -> [T] {
return diameterPathHelper(root).Path
}
typealias HeightAndDiameterAndPath = (Height: Int, Diameter: Int, Path: [T])
private func diameterPathHelper(node: TreeNode<T>?) -> HeightAndDiameterAndPath {
guard let node = node else {
return HeightAndDiameterAndPath(0, 0, [])
}
let left = diameterPathHelper(node.left)
let right = diameterPathHelper(node.right)
let height = max(left.Height, right.Height) + 1
if left.Height + right.Height + 1 > max(left.Diameter, right.Diameter) {
let currentDiameter = left.Height + right.Height + 1
let path = left.Path + [node.data] + right.Path
return HeightAndDiameterAndPath(height, currentDiameter, path)
} else {
if left.Diameter > right.Diameter {
return HeightAndDiameterAndPath(height, left.Diameter, left.Path)
} else {
return HeightAndDiameterAndPath(height, right.Diameter, right.Path)
}
}
}