트리에 대한 알고리즘 문제 소결
트리에 대한 알고리즘 문제 소결
happy: 작은 요약, 후속 계속 보충
부찰·용음은 문제에서 나무의 구조를 언급할 때 다음과 같은 몇 가지 측면에서 고려할 수 있다. 귀속(거대), 창고, 대열이다.예를 들어 다음과 같은 몇 가지 문제.
귀속
두 갈래 나무의 구조가 비교적 고정되어 있기 때문에 한 그루의 나무를 좌우자수로 분해하는 문제를 생각하기 쉽다. 이렇게 하면 하귀환의 사고방식을 사용할 수 있다.귀환하는 동시에 변수의 값(예를 들어 노드, 깊이)을 기록하면 일부 문제를 해결할 수 있다(예를 들어 문제1문제2).여기에는 귀속 방식에 주의할 수 있다. 좌중우, 우중좌 문제다.두 갈래 나무를 검색하는 두 가지 스트리밍 방식은 서로 다른 문제를 해결할 수 있다. 예를 들어 오른쪽 왼쪽을 사용하면 비교적 큰 값을 얻을 수 있다. 예를 들어 제목이다.
제목 0: 두 갈래 나무의 순서 반복 결과 구하기
public class BinaryTreeInorderTraversal {
/**
* ,
* @param root
* @param list
*/
private void solution(TreeNode root, List list) {
if (root.left != null) {
solution(root.left, list);
}
if (root != null) {
list.add(root.val);
}
if (root.right != null) {
solution(root.right, list);
}
}
/**
* ,
*
* @param root
* :
* *1: *
* *2:pop , *
* *3: *
* *4: 3-4*
*/
private List solution(TreeNode root) {
List list = new ArrayList<>();
Stack stack = new Stack<>();
pushAllLeft(root, stack);
while (!stack.empty()) {
TreeNode node = stack.pop();
list.add(node.val);
pushAllLeft(node.right, stack);
}
return list;
}
private void pushAllLeft(TreeNode root, Stack stack) {
while (null != root) {
stack.push(root);
root = root.left;
}
}
}
제목 1: 잎사귀 노드에 대한 루트 구하기
/**
* https://leetcode.com/problems/binary-tree-paths/description/
*/
public class BinaryTreePaths {
List resultList = new ArrayList();
/**
* 。 。
* @param root
* @return
*/
public List solution(TreeNode root) {
if (root == null) {
return resultList;
}
findPaths(root, root.val + "");
return resultList;
}
private void findPaths(TreeNode node, String path) {
if (node.left == null && node.right == null) {
resultList.add(path);
}
if (node.left != null) {
findPaths(node.left, path + "->" + node.left.val);
}
if (node.right != null) {
findPaths(node.right, path + "->" + node.right.val);
}
}
}
제목 2: 교묘한 귀속 1: 역순으로 줄별로 출력 노드의 값
/**
*
* :
* Given binary tree [3,9,20,null,null,15,7],
* 3
* / \
* 9 20
* / \
* 15 7
* return its bottom-up level order traversal as:
* [
* [15,7],
* [9,20],
* [3]
* ]
*
* https://leetcode.com/problems/binary-tree-level-order-traversal-ii/description
*/
public class BinaryTreeLevelOrderTraversal {
public List> levelOrderBottom(TreeNode root) {
List> list = new LinkedList>();
levleMaker(list, root, 0);
return list;
}
/**
* , ,
* @param list
* @param root
* @param level
* : , new、 list
*/
private void levleMaker(List> list, TreeNode root, int level) {
if (root == null) return;
if (list.size() <= level) {
list.add(new LinkedList());
}
levleMaker(list, root.left, level + 1);
levleMaker(list, root.right, level + 1);
list.get(list.size() - 1 - level).add(root.val);
}
}
제목 3: 교묘한 귀속 2: 두 갈래 나무를 검색하면 각 노드에 그보다 큰 노드를 더한다.
Given a Binary Search Tree (BST), convert it to a Greater Tree such that every key of the original BST is changed to the original key plus sum of all keys greater than the original key in BST.
Example:
Input: The root of a Binary Search Tree like this:
5
/ \
2 13
Output: The root of a Greater Tree like this:
18
/ \
20 13
https://leetcode.com/problems/convert-bst-to-greater-tree/description/
public class ConvertBSTtoGreaterTree {
int sum = 0;
/**
* ,
*
* @param root
* @return
* :
* 1: , ( )
* ( 。 , 。)
*/
public TreeNode convertBST(TreeNode root) {
if (root == null)
return null;
convertBST(root.right);
root.val += sum;
sum = root.val;
convertBST(root.left);
return root;
}
}
대열
제목 4: 역순으로 줄에 따라 노드의 값을 출력합니다.같은 제목 2이지만 이 때 대기열 방식을 사용합니다
/**
*
* @param root
* @return
*/
public List> levelOrderBottom2(TreeNode root) {
List> list = new ArrayList>();
if (root == null) return list;
Queue queue = new ArrayDeque();
queue.add(root);
while (!queue.isEmpty()) {
int levelNum = queue.size();
List subList = new LinkedList();
for (int i = 0; i < levelNum; i++) {
if (queue.peek().left != null) queue.offer(queue.peek().left);
if (queue.peek().right != null) queue.offer(queue.peek().right);
subList.add(queue.poll().val);
}
list.add(0, subList);
}
return list;
}
창고
제목 5: 컴파일러, 두 갈래 검색 트리의 가장 작은 값을 되돌려줍니다
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSON
JSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다.
그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다.
저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
public class BinaryTreeInorderTraversal {
/**
* ,
* @param root
* @param list
*/
private void solution(TreeNode root, List list) {
if (root.left != null) {
solution(root.left, list);
}
if (root != null) {
list.add(root.val);
}
if (root.right != null) {
solution(root.right, list);
}
}
/**
* ,
*
* @param root
* :
* *1: *
* *2:pop , *
* *3: *
* *4: 3-4*
*/
private List solution(TreeNode root) {
List list = new ArrayList<>();
Stack stack = new Stack<>();
pushAllLeft(root, stack);
while (!stack.empty()) {
TreeNode node = stack.pop();
list.add(node.val);
pushAllLeft(node.right, stack);
}
return list;
}
private void pushAllLeft(TreeNode root, Stack stack) {
while (null != root) {
stack.push(root);
root = root.left;
}
}
}
/**
* https://leetcode.com/problems/binary-tree-paths/description/
*/
public class BinaryTreePaths {
List resultList = new ArrayList();
/**
* 。 。
* @param root
* @return
*/
public List solution(TreeNode root) {
if (root == null) {
return resultList;
}
findPaths(root, root.val + "");
return resultList;
}
private void findPaths(TreeNode node, String path) {
if (node.left == null && node.right == null) {
resultList.add(path);
}
if (node.left != null) {
findPaths(node.left, path + "->" + node.left.val);
}
if (node.right != null) {
findPaths(node.right, path + "->" + node.right.val);
}
}
}
/**
*
* :
* Given binary tree [3,9,20,null,null,15,7],
* 3
* / \
* 9 20
* / \
* 15 7
* return its bottom-up level order traversal as:
* [
* [15,7],
* [9,20],
* [3]
* ]
*
* https://leetcode.com/problems/binary-tree-level-order-traversal-ii/description
*/
public class BinaryTreeLevelOrderTraversal {
public List> levelOrderBottom(TreeNode root) {
List> list = new LinkedList>();
levleMaker(list, root, 0);
return list;
}
/**
* , ,
* @param list
* @param root
* @param level
* : , new、 list
*/
private void levleMaker(List> list, TreeNode root, int level) {
if (root == null) return;
if (list.size() <= level) {
list.add(new LinkedList());
}
levleMaker(list, root.left, level + 1);
levleMaker(list, root.right, level + 1);
list.get(list.size() - 1 - level).add(root.val);
}
}
Given a Binary Search Tree (BST), convert it to a Greater Tree such that every key of the original BST is changed to the original key plus sum of all keys greater than the original key in BST.
Example:
Input: The root of a Binary Search Tree like this:
5
/ \
2 13
Output: The root of a Greater Tree like this:
18
/ \
20 13
https://leetcode.com/problems/convert-bst-to-greater-tree/description/
public class ConvertBSTtoGreaterTree {
int sum = 0;
/**
* ,
*
* @param root
* @return
* :
* 1: , ( )
* ( 。 , 。)
*/
public TreeNode convertBST(TreeNode root) {
if (root == null)
return null;
convertBST(root.right);
root.val += sum;
sum = root.val;
convertBST(root.left);
return root;
}
}
/**
*
* @param root
* @return
*/
public List> levelOrderBottom2(TreeNode root) {
List> list = new ArrayList>();
if (root == null) return list;
Queue queue = new ArrayDeque();
queue.add(root);
while (!queue.isEmpty()) {
int levelNum = queue.size();
List subList = new LinkedList();
for (int i = 0; i < levelNum; i++) {
if (queue.peek().left != null) queue.offer(queue.peek().left);
if (queue.peek().right != null) queue.offer(queue.peek().right);
subList.add(queue.poll().val);
}
list.add(0, subList);
}
return list;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.