ツリー階層遍歴テンプレート
22508 ワード
ツリー階層のテンプレートを巡回するには、次の手順に従います.
LeetCodeの3つの典型的な二叉木の層順は関連する問題型を遍歴している.
1.ツリーの層順遍歴(LeetCode 102)
ツリーを2つあげます.レイヤ順にループしたノード値を返してください.(つまり、左から右へすべてのノードに階層的にアクセスします).
2.ツリーのジグザグ階層遍歴(LeetCode 103)
ツリーを2つ指定し、ノード値を返すのこぎり階層を巡ります.(すなわち、左から右へ、右から左へと次の層を遍歴し、このようにして層と層の間を交互に行う).
3.ツリーの最大深さ(LeetCode 104)
ツリーに最大深さを指定します.ツリーの深さは、ルートノードから最も遠いリーフノードまでの最長パス上のノード数です.
public void bfs(TreeNode root){
Queue<TreeNode> queue=new LinkedList<>();//
queue.add(root);
while(!queue.isEmpty()){
int cnt=queue.size();
// ,
while(cnt-->0){
TreeNode node=queue.poll();//
list.add(node.val);//
if(node.left!=null){
queue.add(node.left);
}
if(node.right!=null){
queue.add(node.right);
}
}
// , ,
}
}
LeetCodeの3つの典型的な二叉木の層順は関連する問題型を遍歴している.
1.ツリーの層順遍歴(LeetCode 102)
ツリーを2つあげます.レイヤ順にループしたノード値を返してください.(つまり、左から右へすべてのノードに階層的にアクセスします).
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> ret=new ArrayList<>();
if(root==null){
return ret;
}
Queue<TreeNode> queue=new LinkedList<>();
queue.add(root);
while(!queue.isEmpty()){
int cnt=queue.size();
ArrayList<Integer> list=new ArrayList<>();
while(cnt-->0){
TreeNode node=queue.poll();
list.add(node.val);
if(node.left!=null){
queue.add(node.left);
}
if(node.right!=null){
queue.add(node.right);
}
}
ret.add(new ArrayList(list));
}
return ret;
}
}
2.ツリーのジグザグ階層遍歴(LeetCode 103)
ツリーを2つ指定し、ノード値を返すのこぎり階層を巡ります.(すなわち、左から右へ、右から左へと次の層を遍歴し、このようにして層と層の間を交互に行う).
class Solution {
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
List<List<Integer>> ret=new ArrayList<>();
boolean flag=false;
if(root==null){
return ret;
}
Queue<TreeNode> queue=new LinkedList<>();
queue.add(root);
while(!queue.isEmpty()){
int cnt=queue.size();
ArrayList<Integer> list=new ArrayList<>();
while(cnt-->0){
TreeNode node=queue.poll();
list.add(node.val);
if(node.left!=null){
queue.add(node.left);
}
if(node.right!=null){
queue.add(node.right);
}
}
flag=!flag;
if(!flag){
Collections.reverse(list);
}
ret.add(new ArrayList(list));
}
return ret;
}
}
3.ツリーの最大深さ(LeetCode 104)
ツリーに最大深さを指定します.ツリーの深さは、ルートノードから最も遠いリーフノードまでの最長パス上のノード数です.
class Solution {
public int maxDepth(TreeNode root) {
int ret=0;
if(root==null){
return ret;
}
Queue<TreeNode> queue=new LinkedList<>();
queue.add(root);
while(!queue.isEmpty()){
int cnt=queue.size();
ArrayList<Integer> list=new ArrayList<>();
while(cnt-->0){
TreeNode node=queue.poll();
list.add(node.val);
if(node.left!=null){
queue.add(node.left);
}
if(node.right!=null){
queue.add(node.right);
}
}
ret++;
}
return ret;
}
}