LeetCode 866. 具有所有最深结点的最小子树

最近刷LeetCode题目的一些思路,题目信息

给定一个根为 root 的二叉树,每个结点的深度是它到根的最短距离。

如果一个结点在整个树的任意结点之间具有最大的深度,则该结点是最深的

一个结点的子树是该结点加上它的所有后代的集合。

返回能满足“以该结点为根的子树中包含所有最深的结点”这一条件的具有最大深度的结点。

 

示例:

输入:[3,5,1,6,2,0,8,null,null,7,4]
输出:[2,7,4]
解释:

我们返回值为 2 的结点,在图中用黄色标记。
在图中用蓝色标记的是树的最深的结点。
输入 "[3, 5, 1, 6, 2, 0, 8, null, null, 7, 4]" 是对给定的树的序列化表述。
输出 "[2, 7, 4]" 是对根结点的值为 2 的子树的序列化表述。
输入和输出都具有 TreeNode 类型。

 

提示:

  • 树中结点的数量介于 1 和 500 之间。
  • 每个结点的值都是独一无二的。

--------------------------------------------------------------------------------------

先分析下题目,“以该结点为根的子树中包含所有最深的结点”,意思就是找到最深的结点所在的根节点,而且只能一个,所以如果最深的结点有多个,那么需要找到所有最深结点的根节点,步骤如下

1:先找到最深结点,下面的方法会找到当前树的结点深度

public int depth(TreeNode root) {

    if (root == null) {
        return 0;
    }
    if (root.left == null && root.right == null) {
        return 1;
    }
    int left = depth(root.left);
    int right = depth(root.right);
    return left < right ? right + 1 : left + 1;
}

2:找到所有位于最深层的结点

public void getTreeNode(List<TreeNode> list, TreeNode root,int deep, int maxdeep){
    if(root == null){
        return;
    }
    if(deep == maxdeep){
        if(root != null){
            list.add(root);
        }
        return;
    }
    getTreeNode(list,root.left,deep+1,maxdeep);
    getTreeNode(list,root.right,deep+1,maxdeep);
}

3:因为需要找到那些最深层结点的根结点,所以需要建立父结点的关联,将所有结点与其父结点以map的形式存储

private void setParentTreeNode(TreeNode root, Map<TreeNode,TreeNode> parentTreeNodeMap, TreeNode parent){
    if(root == null){
        return;
    }
    if(parent != null){
        parentTreeNodeMap.put(root, parent);
    }
    setParentTreeNode(root.left,parentTreeNodeMap,root);
    setParentTreeNode(root.right,parentTreeNodeMap,root);
}

4:找到所有最深层次结点的根结点,确保它是唯一的

public TreeNode subtreeWithAllDeepest(TreeNode root) {
    Map<TreeNode,TreeNode> parentsTreeMap=new HashMap<>();
    setParentTreeNode(root, parentsTreeMap,null);
    List<TreeNode> deepList = new ArrayList<>();
    int deep = depth(root);
    if(deep == 1){
        return root;
    }
    getTreeNode(deepList,root,1,deep);
    if(deepList.size() == 1){
        return deepList.get(0);
    } else {
        while (deepList.size() > 1){
            int length = deepList.size();
            for(int i=0; i< length; i++){
                TreeNode treeNode = deepList.get(i);
                deepList.remove(i);
                deepList.add(i,parentsTreeMap.get(treeNode));
            }
            while (deepList.size() > 1){
                if(deepList.get(0) == deepList.get(1)){
                    deepList.remove(0);
                } else {
                    break;
                }
            }
        }
    }
    return deepList.get(0);
}

猜你喜欢

转载自blog.csdn.net/SundyGuo/article/details/80986309
今日推荐