二叉树遍历

2020-09-09  本文已影响0人  路在脚下了

前中后序遍历的区别:访问根节点的先后顺序。
递归遍历注意点:注意递归结束的条件(一般是判断节点==nil).

DFS:深度优先策略

①注意空节点(为根节点或者叶子节点的下一层)
②注意叶子节点的处理
③处理当前层需要处理的问题
④递归左右子树
⑤有需要返回的return

BFS:广度优先策略

①注意根节点
②初始化第一层节点,加入队列queue
③循环队列(!queue.isempty),处理队列节点,并判断左右子节点是否为空,然后添加下一层节点到队列,删除当前处理的节

自顶向下

①传入当前层节点与当前层状态(变量)
②空节点问题
③叶子节点问题
④下探入下一层的左右子树,返回①

func pathSum(_ root: Node?, _ sum: Int) -> Bool {
    if root == nil { return false }
    if root?.left == nil && root?.right == nil {
        return root?.val == sum
    }
    return pathSum(root?.left, sum - root!.val) || path(root?.right, sum - root!.val)
}

var ans = 0
// 每下探一层,深度加一
func maximun_d(_ node: TreeNode?, _ depth: Int) {
  // 空节点,没必要继续下探
  if node == nil { return }
    // 下探到最底层,重新比较最大深度
    if (node!.left == nil) && (node!.right == nil) {
        ans = max(ans, depth)
    }
    maximun_d(node?.left, depth + 1)
    maximun_d(node?.right, depth + 1)
}
maximun_d(root, 1)
return ans

自底向上

①空节点问题
②左右子树递归探底
③计算初始问题,并返回结果

// 最大深度
func max_depth(_ root: Node?) -> Int {
    // 空节点,(可能是空根节点或者叶子节点的下一层),返回0
    if root == nil { return 0 }
    var left_depth = 0, right_depth = 0, max_depth = 0
    left_depth = maxi_depth(root?.left)
    right_depth = maxi_depth(root?.right)
    // 每次递归返回一层,深度加1
    max_depth = max(left_depth, right_depth) + 1
    return max_depth
    // 或者
    if root == nil {  return 0  }
    return max(maxDepth(root?.left), maxDepth(root?.right)) + 1
}
上一篇下一篇

猜你喜欢

热点阅读