LeetCode: Smallest Subtree with all the Deepest Nodes
問題をよく見ないで、問題を理解するのに少し時間がかかりました.
問題は,バイナリツリーとすべてのleafノードを含むサブツリーの中で最小のサブツリーをどのように求めるかである.
問題を解く
現在のnodeを基準として,左右のサブツリーの最大高さを求めた.
左右のサブツリーの高さが同じである場合、現在のノードはサブツリーの起点となります.
△絵を描くと分かりやすい.
import java.util.*;
class Solution {
public TreeNode subtreeWithAllDeepest(TreeNode root) {
if(root == null || (root.left == null && root.right == null)) {
return root;
}
TreeNode cur = root;
int leftDepth = getDepth(cur.left);
int rightDepth = getDepth(cur.right);
while(leftDepth != rightDepth) {
if(leftDepth > rightDepth) {
cur = cur.left;
}
if(leftDepth < rightDepth) {
cur = cur.right;
}
leftDepth = getDepth(cur.left);
rightDepth = getDepth(cur.right);
}
return cur;
}
public int getDepth(TreeNode root) {
if (root == null) {
return 0;
}
Queue<Node> q = new LinkedList<>();
q.offer(new Node(root, 1));
int length = 1;
while(!q.isEmpty()) {
Node temp = q.poll();
if(temp.cur.left == null && temp.cur.right == null) {
if(length < temp.length) {
length = temp.length;
}
continue;
}
if(temp.cur.left != null) {
q.offer(new Node(temp.cur.left, temp.length + 1));
}
if(temp.cur.right != null) {
q.offer(new Node(temp.cur.right, temp.length + 1));
}
}
return length;
}
}
class Node {
TreeNode cur;
int length;
Node(TreeNode cur, int length) {
this.cur = cur;
this.length = length;
}
}
(私が解読したコードは再帰とmapで再包装できると思いますが、後で試してみましょう...)Reference
この問題について(LeetCode: Smallest Subtree with all the Deepest Nodes), 我々は、より多くの情報をここで見つけました https://velog.io/@wonhee010/LeetCode-Smallest-Subtree-with-all-the-Deepest-Nodesテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol