수식 트리 

 

수식을 표현하는 이진트리 입니다. 

 

수식트리는 아래의 두 가지 규칙을 따릅니다.

 

피연산자는 잎노드 이다. 

연산자는 루트노드 또는 가지노드이다.  

 

 

수식 트리 만들기 - Build() 함수 

 

연산자의 경우, 토큰으로 새 노드를 생성하여 연결합니다.

그리고 Build() 함수를 재귀호출 하여 다음에 오는 노드 두개를 새 노드의 자식으로 연결합니다. 

 

피연산자의 경우, 토큰으로 새 노드를 생성합니다. 

 

// 수식 트리 구축하기 
void BuildTree(char* postfixExp, Node** node) {

	// 맨 뒤 부터 하나씩 토큰을 읽는다. 
	int len = strlen(postfixExp);
	char token = postfixExp[len - 1];
	postfixExp[len-1] = '\0';

	switch (token) {
		//연산자라면, 2번 BuildTree 재귀호출.
	case '+': case '-': case '*': case '/':
		(*node) = CreateNode(token); //노드에 연결 
		BuildTree(postfixExp, &(*node)->right); // 식을 '뒤부터'읽으니까 오른쪽부터.
		BuildTree(postfixExp, &(*node)->left);
		break;
		
	default: //피연산자라면 노드 생성 
		(*node) = CreateNode(token);
		break;
	}
}

 

 

수식 트리 계산하기 - Calculate() 함수

 

연산자인 경우, 두 자식의 아래 노드들의 연산 결과가 먼저 필요하므로,

두 자식을 파라미터로 넘겨서 Calculate() 함수를 재귀 호출합니다.

  

피연산자인 경우, 토큰에 담겨있던 수를 double형으로 변환하여 반환합니다. 

 

double Calculate(Node* tree) {
	
	double left, right, result = 0;
	char tempChar[2];

	if (tree == NULL) {
		return 0;
	}

	switch (tree->data) {
		case '+': case '-': case '*': case '/':
			left = Calculate(tree->left);
			right = Calculate(tree->right);

			if (tree->data == '+') { 
				result = left + right; 
			}
			else if (tree->data == '-') {
				result = left - right;
			}
			else if (tree->data == '*') {
				result = left * right;
			}
			else if (tree->data == '/') {
				result = left / right;
			}
			break;
		default: //피연산자인 경우,
			memset(tempChar, 0, sizeof(tempChar));
			tempChar[0] = tree->data;
			result = atof(tempChar);
			break;
	}

	return result;
}

 

728x90

'알고리즘 > 알고리즘 C' 카테고리의 다른 글

이진 탐색  (0) 2020.03.18
분리 집합 (유니온파인드) c++  (0) 2020.03.18
이진 트리  (0) 2020.03.11
트리 기초  (0) 2020.03.11
링크드 큐  (0) 2020.03.10

2020-03-10 (목) TIL 

 

트리를 복습하고 짜봤다. 

웹 용역 요구사항을 확인했다. 내 파트에 의문점을 메모하고, 앞으로 뭐가 필요한지 생각했다. 

 

자바스크립트 기본 문법을 연습했다. 

SourceTree와 VScode 를 설치하고 Web 개발에 필요한 확장기능들을 받아놨다.  

 

간만에 크롬 개발자모드 켜고 에러 보고 콘솔 쓰니까 설렜다. 

 

 

 

2020-03-11 (수) TIL 

 

정렬을 공부하고 알고리즘 스터디 준비를 했다. 

 

728x90

'일상 > Today I Learn(TIL)' 카테고리의 다른 글

2020-03-13 TIL  (0) 2020.03.13
2020-03-12 TIL  (0) 2020.03.12
2020-03-09 TIL  (0) 2020.03.09
2020-03-02 TIL  (0) 2020.03.02
2020-02-29 TIL  (0) 2020.02.29

이진 트리란?

 

모든 노드가 2개의 자식을 가진 트리입니다.

 

 

이진 트리의 순회 

 

전위 순회, 중위 순회, 후위 순회 세 가지 방식이 있습니다.  

'루트 노드' 중심으로 생각하면 어렵지 않습니다. 

루트 노드를 가장 먼저 가면 전위 순회.

중간에 루트노드에 가면 중위 순회.

루트 노드를 맨 마지막에 가면 후위 순회입니다. 

 

 

 

전위 순회 

 

루트 -> 왼쪽 -> 오른쪽  순으로 방문합니다. 

 

/* 전위 순회 */
void Preorder(Node* node) {

	// 루트 -> 왼쪽 -> 오른쪽 

	if (NULL == node) {
		return;
	}

	printf("%d\n", node->data);
	
	Preorder(node->leftChild);

	Preorder(node->rightSibling);

}

 

중위 순회 

 

왼쪽 -> 루트 -> 오른쪽 순으로 방문합니다. 

 

/* 중위 순회 */
void Inorder(Node* node) {

	// 왼쪽 -> 루트 -> 오른쪽

	if (NULL == node) {
		return;
	}

	Inorder(node->leftChild);

	printf("%d\n", node->data);

	Inorder(node->rightSibling);

}

 

후위 순회

 

왼쪽 -> 오른쪽 -> 루트  순으로 방문합니다. 

/* 후위 순회 */
void Postorder(Node* node) {

	// 왼쪽 -> 오른쪽 -> 루트

	if (NULL == node) {
		return;
	}

	Postorder(node->leftChild);
	
	Postorder(node->rightSibling);

	printf("%d\n", node->data);

}

 

728x90

'알고리즘 > 알고리즘 C' 카테고리의 다른 글

분리 집합 (유니온파인드) c++  (0) 2020.03.18
수식 이진 트리 (Expression Binary Tree)  (0) 2020.03.11
트리 기초  (0) 2020.03.11
링크드 큐  (0) 2020.03.10
순환 큐  (0) 2020.03.09

윈도우에서 파일이나 폴더 찾는게 너무 느려서 불만이었다. 

 

엄청빨리 검색된다. 

찾아보니 공유폴더 검색도 가능하다. 

 

프리웨어

https://www.voidtools.com/ko-kr/ David Carpenter 님 감사합니다.

 

voidtools

Everything 실시간 파일/폴더 검색 작은 설치파일 깔끔하고 단순한 UI 빠른 파일 색인 빠른 검색 최저 자원 사용 쉬운 파일 공유 실시간 갱신 등등... Everything 1.4.1.965 다운로드 32비트 설치파일 64비트 설치파일 32비트 휴대용 압축파일 64비트 휴대용 압축파일 변경 이력새 기능구버전라이선스SHA256지원 언어도움말

www.voidtools.com

 

728x90

트리란? 

 

뿌리에서 시작하여 가지, 잎으로 이루어진 나무와 비슷한 자료구조. 

운영체제의 파일 시스템, DOM 구조가 '트리'를 활용합니다. 

 

 

 

트리의  구성 요소 

 

부모 : 1번 노드는 2,3,4번 노드의 부모입니다. 

자식 : 2,3,4번 노드는 1번 노드의 자식입니다. 

 

루트(root) : 트리의 맨 꼭대기 '1'번 노드를 루트 노드라고 합니다.

가지 : 트리와 잎노드 사이의 모든 노드들을 뜻합니다. 

잎 노드(terminal node): 가장 끝의 노드, 단말 노드입니다. 

 

경로 : 3번 노드에서 10번 노드까지의 '경로'는 3, 7, 10 입니다. 

길이 : 3번 노드에서 10번 노드까지 2번 이동해야 하므로, 길이는 2입니다. 

노드의 깊이 : 루트 노드에서 해당 노드까지의 길이입니다. 예를 들어, 6번 노드의 깊이는 2입니다.  

(루트의 깊이는 0 입니다. )

 

레벨 : 깊이가  같은 노드의 집합입니다. 예를 들어, 2, 3, 4번 노드는 깊이가 1로 같으므로 레벨1 입니다. 

차수 : 자식 노드의 개수 입니다. 

트리의 차수 : 차수가 최대인 노드의 차수. 아래 그림에서는 1번 노드가 자식이 3개여서, 트리의 차수는 3입니다. 

루트 노드와 잎 노드를 까맣게 표시해 보았다!

 


 

트리 구현

 

왼쪽 자식-오른쪽 형제 표현법(Left Child Right Sibling)을 이용하여 노드를 만들고 부모 자식을 연결합니다. 

 

 

노드

 

링크드 리스트랑 똑같습니다.

typedef struct Node {
	struct Node* leftChild;
	struct Node* rightSibling;
	int data;
};

 

노드 생성 및 메모리 해제 

 

왼쪽 자식을 가리키는 포인터와 오른쪽 형제를 가리키는 포인터를 초기화 해줍니다.  

Node* CreateNode(int data) {

	Node* newNode = (Node*)malloc(sizeof(Node));
	newNode->leftChild = NULL;
	newNode->rightSibling = NULL;
	newNode->data = data;

	return newNode;
}

 

루트의 왼쪽 자식들 오른쪽 자식들을 free()하고, 루트 자신을 메모리 해제한다. 

/* 트리의 노드 전부 삭제 후, 루트 삭제. */
void FreeTree(Node* rootNode) {

	if (NULL != rootNode->leftChild) {
		FreeTree(rootNode->leftChild);
	}

	if (NULL != rootNode->rightSibling) {
		FreeTree(rootNode->rightSibling);
	}

	rootNode->leftChild = NULL;
	rootNode->rightSibling = NULL;

	FreeNode(rootNode);
}

 

 

자식 노드 연결 

 

부모 노드와 자식 노드 포인터를 매개변수로 입력 받습니다. 

자식이 없다면, 자식에 할당해줍니다. 

자식이 있다면, rightSibling 포인터를 이용하여 마지막 자식을 찾아내서 새 자식(?)을 연결합니다. 

/* 부모에게 자식 연결 */
void ConnectChild(Node** parent, Node* child) {

	if (NULL == (*parent)->leftChild) { // 자식이 없다면, 
		(*parent)->leftChild = child;
	}
	else {// 자식이 있다면, 끝을 찾아서 연결한다.
		Node* lastChild = (*parent)->leftChild;

		while (NULL != lastChild->rightSibling) {
			lastChild = lastChild->rightSibling;
		}

		lastChild->rightSibling = child;
	}
}

 

 

트리를 순회하며 출력 

 

자식과 형제를 출력하기 위해 함수를 재귀 호출 합니다.  

/* 트리 순회하며 출력 */
void Print(Node* node, int depth) {

	int num = 0;

	// 깊이 만큼 들여쓰기 
	for (num = 0; num < depth; num++) {
		printf(" ");
	}

	// 데이터 출력 
	printf("%d\n", node->data);

	// depth를 더해서 자식노드를 출력하도록 함수 재귀 호출 
	if (NULL != node->leftChild) {
		Print(node->leftChild, depth++);
	}

	// 형제노드를 출력하도록 함수 재귀 호출 (depth 유지.)
	if (NULL != node->rightSibling) {
		Print(node->rightSibling, depth);
	}
	
}

 

728x90

'알고리즘 > 알고리즘 C' 카테고리의 다른 글

수식 이진 트리 (Expression Binary Tree)  (0) 2020.03.11
이진 트리  (0) 2020.03.11
링크드 큐  (0) 2020.03.10
순환 큐  (0) 2020.03.09
링크드 리스트로 구현하는 스택  (0) 2020.02.19

자바스크립트 기본 문법을 기록합니다. 

 


자바스크립트 란 ?

 

HTML을 동적으로 제어한다. 

 

 

개발 환경 구축

 

VScode 설치 

SourceTree 설치 

GitHub 가입하고 javascript playground 레포지토리 하나 생성 

Atlassian 계정 만들고 sourceTree에 로그인

VScode의 다양한 확장기능 설치 :)

크롬 켜고, Ctrl + i 눌러서 개발자 모드 켜고 끄기!  Console 과 Source 보면서 조작해보자. 

 

 

자료형 

 

어떤 종류의 데이터인지 컴퓨터에게 알려준다. 

자료형이 같아야 연산이 가능하다. 

 

Number : 정수와 실수 

String : 문자열 (Immutable 특징을 가진다)  '+' 문자열끼리 이어붙일 수 있다. 

Boolean : true  false를 구분 

Null

Undefined 

Object

 

Immutable 특징이란? 
변경이 불가능한 객체. 한 번 만들면 상태를 변경할 수 없다.
상수 라고 이해하면 좋다. 변형 하려면, 무조건 객체를 새로 만든다. 

 

자료형 확인해보기 

크롬 개발자모드 콘솔
Boolean 타입 확인 

 

 

 

변수 

 

데이터를 담은 메모리 공간

 

변수를 선언하고 값을 할당한다  '='을 사용한다. 

변수에 값 할당

유의 :  '같다'를 표시하는 것은 연산자 === 을 쓴다. '다르다'를 표시하려면 != 를 쓴다. 

 

 

문자열의 길이 

변수명.length 를 쓴다

 

문자열의 인덱스 이용

 

문자열을 대소문자로 변환 하는 함수 

 

 

undefined : 값이 정의되지 않았다 

null: 값이 비어있다.

NaN: 값이 아니다 (=== 계산이 불가능 )

 

 

 

alter() 와 prompt() 함수 

 

프롬프트를 띄워서 질문과 입력을 받아본다. 

입력받은 것은 변수에 저장된다. 

프롬프트에 대답을 입력한다. 

입력폼에 대답을 입력하면 ans 라는 변수에 저장된다. 

 

alter(ans) 결과 

 

Number() 함수

문자열을 숫자로 변환

 

 

728x90

'프로그래밍 > Node.js' 카테고리의 다른 글

Express  (0) 2020.03.13
Node.js  (0) 2020.03.13
동기 vs 비동기  (0) 2020.03.13
npm 모듈을 이용해보자  (0) 2020.03.13
Node.js 설치 , NPM 모듈 설치  (0) 2020.03.13

링크드 큐 

 

링크드 리스트로 만든 큐입니다.

배열로 만든 순환 큐와는 달리 공백/포화를 구분할 필요가 없습니다. 

 

head 노드에서 제거하고, tail 노드에서 삽입합니다. 

 

 

 

노드 선언과 큐 

 

노드는 링크드 리스트의 노드와 똑같습니다. 

링크드 큐 구조체는 전단과 후단을 가리킬 포인터와 총 노드 개수 변수를 가집니다. 

typedef struct Node {
	char* data;
	struct Node* nextNode;
};

typedef struct LQ {
	struct Node* front;
	struct Node* rear;
	int nodeCnt;
};

 

노드 생성과 메모리 해제

void CreateQueue(LQ** lq) {

	(*lq) = (LQ*)malloc(sizeof(LQ));
	(*lq)->front = NULL;
	(*lq)->rear = NULL;
	(*lq)->nodeCnt = 0;
}

 

삽입

/* 후단에 삽입 */
void Enqueue(LQ* lq, Node* newNode) {

	if (NULL == lq->front) {
		lq->front == newNode;
		lq->rear == newNode;
	}
	else {
		lq->rear->nextNode = newNode;
		lq->rear = newNode;
	}

	lq->nodeCnt++;

}

 

제거 

/* 전단에서 제거 */
Node* Dequeue(LQ* lq) {

	Node* out = lq->front;

	if (NULL == lq->front->nextNode) {
		lq->front = NULL;
		lq->rear = NULL;
	}
	else {
		lq->front = lq->front->nextNode;
	}

	lq->nodeCnt--;

	return out;
}

 

728x90

'알고리즘 > 알고리즘 C' 카테고리의 다른 글

이진 트리  (0) 2020.03.11
트리 기초  (0) 2020.03.11
순환 큐  (0) 2020.03.09
링크드 리스트로 구현하는 스택  (0) 2020.02.19
배열로 구현하는 스택  (0) 2020.02.18

+ Recent posts