解题思路
首先,本题需要确认如何递归树?是选择前序遍历、中序遍历还有后序遍历。在这里,我们需要使用的是后序遍历。因为题目当中是让求子树,在二叉树中子树的最小集就是叶子节点,所以需要从叶子节点递归向上遍历。
其次,我们需要根据递归三部曲来设计递归函数。
参数与返回值:参数就是当前的节点,返回值是子节点的值和当前节点的子树是否为同值子树
递归结束条件:遍历到叶子节点的时候结束递归
单层循环流程:判断左右子节点的值与根节点是否相等,如果相等则代表找到了同值子树则加一。
示例代码
func countUnivalSubtrees(root *TreeNode) int {
cnt = 0
helper(root)
return cnt
}
var cnt int
func helper(node *TreeNode) (int, bool) {
if node == nil {
return -1, true
}
lval, lflag := helper(node.Left)
rval, rflag := helper(node.Right)
if lval != -1 && lval != node.Val {
lflag = false
}
if rval != -1 && rval != node.Val {
rflag = false
}
bns := lflag && rflag
if bns {
cnt++
}
return node.Val, bns
}
时间复杂度
由于使用的是后序遍历,每个节点都递归遍历一次,所以时间复杂度为O(n)