• 二叉树的递归


    1.Minimum Depth of Binary Tree

        // 递归版,时间复杂度O(n),空间复杂度O(logn)
    	private static int minDepth(TreeNode root) {
    		if (root == null)   return 0;  
    		return Math.min(minDepth(root.left), minDepth(root.right))+1;
    	}
    

    2.Maximum Depth of Binary Tree

    同上,递归版,// 时间复杂度O(n),空间复杂度O(logn)
    public int maxDepth(TreeNode root) {
        if (root == null) return 0;
        return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1;
    }
    

    3.Path Sum

    return true, as there exist a root-to-leaf path 5->4->11->2 which sum is 22
    // 时间复杂度O(n),空间复杂度O(logn)
    public boolean hasPathSum(TreeNode root, int sum) {
        if (root == null) return false;
        if (root.left == null && root.right == null) // leaf
            return sum == root.val;
        return hasPathSum(root.left, sum - root.val) || hasPathSum(root.right, sum - root.val);
    }
    

    4.Path Sum II

            同上,返回路径  // 时间复杂度O(n),空间复杂度O(logn)
    	public List<List<Integer>> pathSum(TreeNode root, int sum) {
    		List<List<Integer>> result = new ArrayList<>();
    		ArrayList<Integer> cur = new ArrayList<>(); // 中间结果
    		pathSum(root, sum, cur, result);
    		return result;
    	}
    
    	private static void pathSum(TreeNode root, int gap, ArrayList<Integer> cur, List<List<Integer>> result) {
    		if (root == null)  return;
    		cur.add(root.val);
    		if (root.left == null && root.right == null) {
    			if (gap == root.val) {  result.add(new ArrayList<>(cur)); }
    		}
    		pathSum(root.left, gap - root.val, cur, result);
    		pathSum(root.right, gap - root.val, cur, result);
    		cur.remove(cur.size() - 1);   //添加的删除了
    	}
    

    5.Binary Tree Maximum Path Sum

        // 时间复杂度O(n),空间复杂度O(logn)
        private int max_sum;
    	private int dfs(TreeNode root) {
    		if (root == null) return 0;
    
    		int l = dfs(root.left);
    		int r = dfs(root.right);
    
    		int sum = root.val;
    		if (l > 0) sum += l;
    		if (r > 0) sum += r;
    
    		max_sum = Math.max(sum, max_sum);
    		return Math.max(l, r) > 0 ? Math.max(l, r) + root.val : root.val;
    	}
    

     6、给一棵二叉树, 找到和为最小的子树, 返回其根节点。

    public class Solution {
        private TreeNode subtree = null;
        private int subtreeSum = Integer.MAX_VALUE;
    
        public TreeNode findSubtree(TreeNode root) {
            helper(root);
            return subtree;
        }
        
        private int helper(TreeNode root) {
            if (root == null) {
                return 0;
            }
            
            int sum = helper(root.left) + helper(root.right) + root.val;
            if (sum <= subtreeSum) {
                subtreeSum = sum;
                subtree = root;
            }
            return sum;
        }
    }
    

    7、求从根(root)到叶(leaf)的所有路径

    Input:{1,2,3,#,5}
    Output:["1->2->5","1->3"]
    Explanation:
    1
    /
    2 3

    5

    public class Solution {
    
        public List<String> binaryTreePaths(TreeNode root) {
            List<String> paths = new ArrayList<>();
            if (root == null) {
                return paths;
            }
            
            List<String> leftPaths = binaryTreePaths(root.left);
            List<String> rightPaths = binaryTreePaths(root.right);
            for (String path : leftPaths) {
                paths.add(root.val + "->" + path);
            }
            for (String path : rightPaths) {
                paths.add(root.val + "->" + path);
            }
            
            // root is a leaf
            if (paths.size() == 0) {
                paths.add("" + root.val);
            }
            
            return paths;
        }
    }
    

      

    8、给定一棵二叉树,找到两个节点的最近公共父节点(LCA)。

    最近公共祖先是两个节点的公共的祖先节点且具有最大深度。

    public class Solution {
        // 在root为根的二叉树中找A,B的LCA:
        // 如果找到了就返回这个LCA
        // 如果只碰到A,就返回A
        // 如果只碰到B,就返回B
        // 如果都没有,就返回null
        public TreeNode lowestCommonAncestor(TreeNode root, TreeNode node1, TreeNode node2) {
            if (root == null || root == node1 || root == node2) {
                return root;
            }
            
            // Divide
            TreeNode left = lowestCommonAncestor(root.left, node1, node2);
            TreeNode right = lowestCommonAncestor(root.right, node1, node2);
            
            // Conquer
            if (left != null && right != null) {
                return root;
            } 
            if (left != null) {
                return left;
            }
            if (right != null) {
                return right;
            }
            return null;
        }
    }

    参考:九章算法

    https://www.jiuzhang.com/

    https://www.jiuzhang.com/solutions/minimum-subtree/

    https://www.jiuzhang.com/solutions/binary-tree-paths/

  • 相关阅读:
    内存中字的存储
    代码段
    CPU运行的流程
    字的传送
    内存中字的存储
    c语言中求数组元素的最大值和最小值
    linux系统 centos8.3 中安装 Rsudio
    Error in .External2(C_X11, paste0("png::", filename), g$width, g$height, : 解决linux R绘图问题
    linux系统中使用R的Cairo绘制png格式图片
    c语言中利用二维数组统计考试成绩之和
  • 原文地址:https://www.cnblogs.com/rnanprince/p/11595176.html
Copyright © 2020-2023  润新知