刷题7 剑指 Offer — DFS

树的遍历方式总体分为两类:深度优先搜索(DFS)、广度优先搜索(BFS);
常见的 DFS : 先序遍历、中序遍历、后序遍历;
前序遍历:输出顺序:根节点、左子树、右子树
中序遍历:输出顺序:左子树、根节点、右子树
后序遍历:输出顺序:左子树、右子树、根节点
常见的 BFS : 层序遍历(即按层遍历)。

剑指 Offer 27. 二叉树的镜像

  • 时间复杂度:O(n),空间复杂度:O(n)
    https://leetcode-cn.com/leetbook/read/illustrate-lcof/xsepg3/
例如输入:
      4
  2      7
1   3  6   9

镜像输出:
     4
  7     2
9   6  3   1

输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]

var mirrorTree = function(root) {
    let res = null;
    if(root != null){
        res =new TreeNode(root.val);
        res.left = mirrorTree(root.right);
        res.right = mirrorTree(root.left);
    }
    return res 
};

剑指 Offer 28. 对称的二叉树

https://leetcode-cn.com/leetbook/read/illustrate-lcof/xsrxq1/

  • 时间复杂度:O(n)
var isSymmetric = function(root) {
    if(root==null){
        return true;
    }
    return dfs(root.left,root.right)
};
var dfs = function(t1, t2){
    if(t1==null && t2==null) {return true}
    if(t1==null|| t2==null) {return false}
    if(t1.val != t2.val){return false}
    return dfs(t1.left,t2.right) && dfs(t1.right,t2.left)
}

剑指 Offer 54. 二叉搜索树的第 k 大节点

https://leetcode-cn.com/leetbook/read/illustrate-lcof/xspy85/

  • 时间复杂度:O(n),空间复杂度:O(1)
  • 二叉搜索树:根节点的值大于其左子树中任意一个节点的值,小于其右节点中任意一节点的值,这一规则适用于二叉查找树中的每一个节点。
  • 二叉搜索树的【中序遍历】为 【递增序列】,易得二叉搜索树的 【中序遍历倒序】 为 【递减序列】 。
    因此,求 “二叉搜索树第 k大的节点” 可转化为求 “此树的【中序遍历倒序】的第 k 个节点”。 中序遍历 为 “左、根、右” 顺序,倒序就是“右、根、左” 。
    时间复杂度:O(n),空间复杂度:O(1)
var nums;
var res;
var kthLargest = function(root, k) {
    nums = k
    dfs(root);
    return res;
};
var dfs = function(root){
    if(root == null){
        return;
    }
    dfs(root.right);
    if(nums == 0){
        return
    }
    nums --;
    if(nums==0){
        res = root.val
    }
    dfs(root.left)
}

剑指 Offer 55 - I. 二叉树的深度

https://leetcode-cn.com/leetbook/read/illustrate-lcof/xsaki2/

  • 时间复杂度:O(n),空间复杂度:O(1)
var maxDepth = function(root) {
    if(root == null){
        return 0
    }
    return Math.max(maxDepth(root.left),maxDepth(root.right))+1
};

你可能感兴趣的:(刷题7 剑指 Offer — DFS)