Leetcode 두 갈래 나무 네 가지 반복 방식 총결산
45127 단어 프로그래밍 알고리즘
기사 목록
1. 앞의 순서를 두루 훑어보다
Leetcode 144. 두 갈래 나무의 앞 순서가 두루 다니다
반복 구현:class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
helper(root, res);
return res;
}
private void helper(TreeNode root, List<Integer> res) {
if (root == null) {
return;
}
res.add(root.val);
helper(root.left, res);
helper(root.right, res);
}
}
반복 실현: 왼쪽 지점을 따라 전개하고 동시에 창고를 눌러 왼쪽 나무가 비어 있을 때까지 한다.창고 꼭대기 요소를 꺼내서 오른쪽 트리로 돌려 창고가 비어 있을 때까지 위 절차를 반복합니다.이 방법은 세 가지 반복 방식에 적용된다.
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
helper(root, res);
return res;
}
private void helper(TreeNode root, List<Integer> res) {
if (root == null) {
return;
}
res.add(root.val);
helper(root.left, res);
helper(root.right, res);
}
}
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
if (root == null) {
return new ArrayList<>();
}
List<Integer> res = new ArrayList<>();
Stack<TreeNode> stk = new Stack<>();
while (true) {
while (root != null) {
res.add(root.val);
stk.push(root);
root = root.left;
}
if (stk.isEmpty()) {
break;
}
TreeNode node = stk.pop();
root = node.right;
}
return res;
}
}
반복 실현: 매번 순환, 오른쪽 노드 선입 후출, 왼쪽 노드 후입 선출, 창고의 특성을 이용하여 반복을 완성하고 전차 반복에만 적용.
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
if (root == null) {
return new ArrayList<>();
}
List<Integer> res = new ArrayList<>();
Stack<TreeNode> stk = new Stack<>();
stk.push(root);
while (!stk.isEmpty()) {
TreeNode node = stk.pop();
res.add(node.val);
if (node.right != null) {
stk.push(node.right);
}
if (node.left != null) {
stk.push(node.left);
}
}
return res;
}
}
2.중서 반복
Leetcode 94. 두 갈래 나무의 중서가 두루 다니다
반복 구현:class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
helper(root, res);
return res;
}
private void helper(TreeNode root, List<Integer> res) {
if (root == null) {
return;
}
helper(root.left, res);
res.add(root.val);
helper(root.right, res);
}
}
반복 구현:class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
if (root == null) {
return new ArrayList<>();
}
List<Integer> res = new ArrayList<>();
Stack<TreeNode> stk = new Stack<>();
while (true) {
while (root != null) {
stk.push(root);
root = root.left;
}
if (stk.isEmpty()) {
break;
}
TreeNode node = stk.pop();
res.add(node.val);
root = node.right;
}
return res;
}
}
3. 뒤서다
Leetcode 145. 두 갈래 나무의 뒤가 두루 다니다
반복 구현:class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
helper(root, res);
return res;
}
private void helper(TreeNode root, List<Integer> res) {
if (root == null) {
return;
}
helper(root.left, res);
helper(root.right, res);
res.add(root.val);
}
}
반복 실현: 후차 역주행은 역전차 역주행의 역주행 출력이다. 역전차 역주행은 루트 노드를 먼저 방문하고 오른쪽 트리를 처리하며 마지막으로 왼쪽 트리를 처리한다.
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
helper(root, res);
return res;
}
private void helper(TreeNode root, List<Integer> res) {
if (root == null) {
return;
}
helper(root.left, res);
res.add(root.val);
helper(root.right, res);
}
}
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
if (root == null) {
return new ArrayList<>();
}
List<Integer> res = new ArrayList<>();
Stack<TreeNode> stk = new Stack<>();
while (true) {
while (root != null) {
stk.push(root);
root = root.left;
}
if (stk.isEmpty()) {
break;
}
TreeNode node = stk.pop();
res.add(node.val);
root = node.right;
}
return res;
}
}
Leetcode 145. 두 갈래 나무의 뒤가 두루 다니다
반복 구현:
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
helper(root, res);
return res;
}
private void helper(TreeNode root, List<Integer> res) {
if (root == null) {
return;
}
helper(root.left, res);
helper(root.right, res);
res.add(root.val);
}
}
반복 실현: 후차 역주행은 역전차 역주행의 역주행 출력이다. 역전차 역주행은 루트 노드를 먼저 방문하고 오른쪽 트리를 처리하며 마지막으로 왼쪽 트리를 처리한다.
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
if (root == null) {
return new ArrayList<>();
}
List<Integer> res = new ArrayList<>();
Stack<TreeNode> stk = new Stack<>();
while (true) {
while (root != null) {
res.add(root.val);
stk.push(root);
root = root.right;
}
if (stk.isEmpty()) {
break;
}
TreeNode node = stk.pop();
root = node.left;
}
Collections.reverse(res);
return res;
}
}
반복 실현: 뒷차례 반복 중, 오른쪽 트리를 다 훑어봐야 루트 노드에 접근할 수 있습니다.따라서 변수를 도입하여 지난번 방문한 노드를 기록하여 오른쪽 트리에 대한 반복이 완료되었는지 판단해야 한다.
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
if (root == null) {
return new ArrayList<>();
}
List<Integer> res = new ArrayList<>();
Stack<TreeNode> stk = new Stack<>();
TreeNode pre = null;
while (root != null) {
pre = root;
stk.push(root);
root = root.left;
}
while (!stk.isEmpty()) {
TreeNode node = stk.peek();
if (pre == node.right || node.right == null) {
pre = stk.pop();
res.add(node.val);
} else {
root = node.right;
while (root != null) {
pre = root;
stk.push(root);
root = root.left;
}
}
}
return res;
}
}
4. 겹겹이 훑어보기
Leetcode 102. 두 갈래 나무의 층이 두루 다니다
반복 구현:class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
helper(root, 0, res);
return res;
}
private void helper(TreeNode root, int level, List<List<Integer>> res) {
if(root == null) {
return;
}
if(level == res.size()) {
res.add(new ArrayList<>());
}
res.get(level).add(root.val);
helper(root.left, level+1,res);
helper(root.right,level+1,res);
}
}
반복 구현:class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
if (root == null) {
return new ArrayList<>();
}
List<List<Integer>> res = new ArrayList<>();
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()) {
int n = queue.size();
List<Integer> ans = new ArrayList<>();
for (int i = 0; i < n; i++) {
TreeNode node = queue.remove();
ans.add(node.val);
if (node.left != null) {
queue.add(node.left);
}
if (node.right != null) {
queue.add(node.right);
}
}
res.add(ans);
}
return res;
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Nowcoder 27. 두 갈래 나무의 거울
제목 링크:https://www.nowcoder.com/practice/564f4c26aa584921bc75623e48ca3011
기사 목록
1. 사고방식
2. 복잡도
3. 코드
모든 비잎 노드에 대해 좌우 노드를 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
helper(root, 0, res);
return res;
}
private void helper(TreeNode root, int level, List<List<Integer>> res) {
if(root == null) {
return;
}
if(level == res.size()) {
res.add(new ArrayList<>());
}
res.get(level).add(root.val);
helper(root.left, level+1,res);
helper(root.right,level+1,res);
}
}
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
if (root == null) {
return new ArrayList<>();
}
List<List<Integer>> res = new ArrayList<>();
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()) {
int n = queue.size();
List<Integer> ans = new ArrayList<>();
for (int i = 0; i < n; i++) {
TreeNode node = queue.remove();
ans.add(node.val);
if (node.left != null) {
queue.add(node.left);
}
if (node.right != null) {
queue.add(node.right);
}
}
res.add(ans);
}
return res;
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Nowcoder 27. 두 갈래 나무의 거울제목 링크:https://www.nowcoder.com/practice/564f4c26aa584921bc75623e48ca3011 기사 목록 1. 사고방식 2. 복잡도 3. 코드 모든 비잎 노드에 대해 좌우 노드를 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.