最近刷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:先找到最深结点,下面的方法会找到当前树的结点深度
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(Listlist, 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> 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> parentsTreeMap=new HashMap<>(); setParentTreeNode(root, parentsTreeMap,null); List 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); }