Leetcode 250. 统计同值子树

77 阅读1分钟

题目地址

解题思路


首先,本题需要确认如何递归树?是选择前序遍历、中序遍历还有后序遍历。在这里,我们需要使用的是后序遍历。因为题目当中是让求子树,在二叉树中子树的最小集就是叶子节点,所以需要从叶子节点递归向上遍历。
其次,我们需要根据递归三部曲来设计递归函数。
参数与返回值:参数就是当前的节点,返回值是子节点的值和当前节点的子树是否为同值子树
递归结束条件:遍历到叶子节点的时候结束递归
单层循环流程:判断左右子节点的值与根节点是否相等,如果相等则代表找到了同值子树则加一。

示例代码

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)