알고리즘
릿코드 1457. Pseudo-Palindromic Paths in a Binary Tree 코틀린
rkrkrr0101
2024. 1. 24. 10:04
노드의 루트-리프가
전부 2배수
1개만 1개고 나머지 다 2배수(루트노드 하나만있는거도 여기포함)
를 만족하면 회문가능임
재귀함수 하나 짜서 현재 쌓인 노드 쭉들고가다가,
내가 리프면 회문판단해서 맞으면 1리턴 아니면 0리턴하고,
이것들을 모아서 리턴하면될듯
메모리 아웃
class Solution {
fun pseudoPalindromicPaths (root: TreeNode?): Int {
var res=0
res=sumPalCount(root!!, mutableListOf<Int>())
println(res)
return (res)
}
private fun sumPalCount(node:TreeNode, curPath:List<Int>):Int{
val path= curPath.toMutableList()
path.add(node.`val`)
if (node.left==null && node.right==null){
val pathHashMap = hashMapOf<Int, Int>()
for (i in path){
pathHashMap[i]=pathHashMap[i]?.plus(1)?:1
}
var oneLimit=0
for ((key,value)in pathHashMap){
if (value%2==1){
oneLimit+=1
}
if (oneLimit>=2){
return 0
}
}
return 1
}
var sumPal=0
if (node.left!=null) {
sumPal += sumPalCount(node.left!!, path)
}
if (node.right!=null) {
sumPal += sumPalCount(node.right!!, path)
}
return sumPal
}
}
정답
class Solution {
val map = hashMapOf<Int,Int>()
var res = 0
fun pseudoPalindromicPaths (root: TreeNode?): Int {
rec(root)
return res
}
fun rec(node:TreeNode?){
if(node==null) return
if(node?.left==null&&node?.right==null){
map[node!!.`val`] = map.getOrDefault(node.`val`,0)+1
var c =0
map.values.forEach{
if(it%2!=0) c++
}
if(c<=1) res++
map[node!!.`val`] = map.getOrDefault(node.`val`,1)-1
return
}
map[node.`val`] = map.getOrDefault(node.`val`,0)+1
rec(node.left)
rec(node.right)
map[node.`val`] = map.getOrDefault(node.`val`,1)-1
}
}