【改造后序遍历算法】865. 具有所有最深节点的最小子树

865. 具有所有最深节点的最小子树

解题思路

  • 涉及到子树 需要使用分解的思路 改造后序遍历算法
  • 输入一个节点 返回该节点的最大深度 以及最深叶子节点的最近公共祖先节点
class Solution {
    class Result{
        public TreeNode node;
        public int depth;
        public Result(TreeNode node,int depth){
            // 记录最近公共祖先节点 node
            this.node = node;
            this.depth = depth;
        }
    }
    public TreeNode subtreeWithAllDeepest(TreeNode root) {
        // 涉及到子树  需要使用分解的思路  改造后序遍历算法
        Result res = maxDepth(root);
        return res.node;
    }

    // 分解思路  输入一个节点   返回该节点的最大深度 以及最深叶子节点的最近公共祖先节点
    Result maxDepth(TreeNode root){
        if(root == null){
            return new Result(null,0);
        }

        // 计算左右子树的最大深度
        Result left = maxDepth(root.left);
        Result right = maxDepth(root.right);

        if(left.depth == right.depth){
            // 左右子树的最大深度相同  那么根节点就是最近公共祖先
            return new Result(root,left.depth + 1);
        }

        // 左右子树的深度不同  最近公共祖先在depth较大的一边
        Result res =  left.depth > right.depth ? left: right;
        res.depth++;
        return res;

    }
}

你可能感兴趣的:(#,Leetcode,算法,java,数据结构)