✏️오늘의 문제
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) { this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
class Solution {
private TreeNode newRoot = null;
private TreeNode current = null;
public TreeNode increasingBST(TreeNode root) {
inOrderTraversal(root);
return newRoot;
}
private void inOrderTraversal(TreeNode node) {
if(node == null) return;
inOrderTraversal(node.left);
if(newRoot == null) {
newRoot = new TreeNode(node.val);
current = newRoot;
} else {
current.right = new TreeNode(node.val);
current = current.right;
}
inOrderTraversal(node.right);
}
}
TreeNode 클래스
val: 노드의 값을 저장합니다.left: 왼쪽 자식을 가리키는 포인터입니다.right: 오른쪽 자식을 가리키는 포인터입니다.Solution 클래스
newRoot: 새로운 트리의 루트를 저장하는 변수입니다.current: 새로운 트리에서 현재 위치를 추적하는 변수입니다.inOrderTraversal 메서드를 호출하여 트리를 중위 순회합니다.newRoot)를 반환합니다.newRoot가 null인 경우, 새로운 노드를 생성하고 newRoot와 current를 설정합니다.current를 갱신합니다.newRoot가 null일 때는 새로운 트리의 시작점이 되며, 이후에는 current를 통해 새로운 노드를 계속 추가합니다.increasingBST 메서드는 새로운 트리의 루트를 반환합니다. 이 트리는 모든 노드가 오른쪽으로만 연결된 형태로, 각 노드는 오름차순으로 정렬되어 있습니다.public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) {
this.val = val;
}
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
class Solution {
private TreeNode dummy = new TreeNode(0); // 더미 노드
private TreeNode current = dummy; // 현재 노드
public TreeNode increasingBST(TreeNode root) {
inOrderTraversal(root);
return dummy.right; // 더미 노드의 오른쪽 자식 반환
}
private void inOrderTraversal(TreeNode node) {
if (node == null) return;
inOrderTraversal(node.left); // 왼쪽 서브트리 방문
// 현재 노드의 값을 새로운 노드에 추가
current.right = new TreeNode(node.val);
current = current.right; // 현재 노드 갱신
inOrderTraversal(node.right); // 오른쪽 서브트리 방문
}
}
현재 제공된 코드도 이진 탐색 트리를 오름차순으로 변환하는 데 효율적이지만, 더 간결하게 작성할 수 있는 방법이 있습니다. 특히, 새로운 트리를 생성하는 과정에서 불필요한 객체 생성을 줄이고, 메모리를 효율적으로 사용할 수 있습니다.
더미 노드 사용:
dummy 노드를 사용하여 새로운 트리의 시작점을 쉽게 관리할 수 있습니다. 이로 인해 newRoot 변수를 별도로 관리할 필요가 없습니다.current는 항상 dummy의 오른쪽 자식을 가리키므로, 새로운 노드를 추가할 때 current를 갱신하는 작업이 더 직관적입니다.코드 간결성:
newRoot를 초기화하는 과정이 필요 없어져 코드가 더욱 깔끔해졌습니다.이 개선된 코드는 기존 코드와 동일한 시간 복잡도(O(n))를 유지하며, 메모리 사용 측면에서도 더 효율적입니다. 더미 노드를 통해 초기화 및 관리가 용이해져 가독성도 향상되었습니다.