본문 바로가기
CS/Algorithm

BFS / DFS (Binary Tree)

by keyBomb 2021. 7. 2.

이런 정렬되지 않은 모양의 트리를 만들고 BFS, DFS를 구현해보려고 한다.

 

  • BFS with queue
#include<iostream>
#include<queue>
#include<stack>
using namespace std;
class Node {
private:
	Node* left;
	Node* right;
	Node* root;
	int val;
public:
	Node() : val(0), left(nullptr), right(nullptr), root(nullptr) {};
	Node(int _val) : val(_val), left(nullptr), right(nullptr), root(nullptr) {};
	
	void SetLeft(Node* node) { this->left = node; }
	void SetRight(Node* node) { this->right = node; }
	Node* getLeft() { return left; }
	Node* getRight() { return right; }
	int getValue() { return val; }
	~Node() {};
};

void bfs(Node* node) {
	queue<Node *> q;
	q.push(node);

	while (!q.empty()) {
		node = q.front();
		int value = node->getValue();
		q.pop();
		cout << value << " ";
		if (node->getLeft()) q.push(node->getLeft());
		if (node->getRight()) q.push(node->getRight());
	}
}

int main(void) {
	Node* node1 = new Node(1);
	Node* node2 = new Node(2);
	Node* node3 = new Node(3);
	Node* node4 = new Node(4);

	Node* node5 = new Node(5);
	Node* node6 = new Node(6);
	node4->SetLeft(node1);
	node4->SetRight(node2);
	node1->SetLeft(node3);
	node1->SetRight(node5);
	node2->SetRight(node6);

	bfs(node4);
    
	return 0;
}

// result : 4, 1, 2, 3, 5, 6

 

  • DFS with recursion ( inorder )
#include<iostream>
#include<queue>
#include<stack>
using namespace std;
class Node {
private:
	Node* left;
	Node* right;
	Node* root;
	int val;
public:
	Node() : val(0), left(nullptr), right(nullptr), root(nullptr) {};
	Node(int _val) : val(_val), left(nullptr), right(nullptr), root(nullptr) {};
	
	void SetLeft(Node* node) { this->left = node; }
	void SetRight(Node* node) { this->right = node; }
	Node* getLeft() { return left; }
	Node* getRight() { return right; }
	int getValue() { return val; }
	~Node() {};
};
void inorder(Node* node) {
	if (node == nullptr) return;

	inorder(node->getLeft());
	cout << node->getValue() << " ";
	inorder(node->getRight());
}

int main(void) {
	Node* node1 = new Node(1);
	Node* node2 = new Node(2);
	Node* node3 = new Node(3);
	Node* node4 = new Node(4);

	Node* node5 = new Node(5);
	Node* node6 = new Node(6);
	node4->SetLeft(node1);
	node4->SetRight(node2);
	node1->SetLeft(node3);
	node1->SetRight(node5);
	node2->SetRight(node6);

	inorder(node4);

	return 0;
}

// result : 3, 1, 5, 4, 2, 6

 

  • DFS with iterative ( inorder )
#include<iostream>
#include<queue>
#include<stack>
using namespace std;

class Node {
private:
	Node* left;
	Node* right;
	Node* root;
	int val;
public:
	Node() : val(0), left(nullptr), right(nullptr), root(nullptr) {};
	Node(int _val) : val(_val), left(nullptr), right(nullptr), root(nullptr) {};
	
	void SetLeft(Node* node) { this->left = node; }
	void SetRight(Node* node) { this->right = node; }
	Node* getLeft() { return left; }
	Node* getRight() { return right; }
	int getValue() { return val; }
	~Node() {};
};

void dfs(Node* node) {
	stack<Node*> s;

	while (!s.empty() || node != nullptr) {
		while (node != nullptr) {
			s.push(node);
			node = node->getLeft();
		}
		node = s.top(); s.pop();
		cout << node->getValue() << " ";
		node = node->getRight();
	}
}
int main(void) {
	Node* node1 = new Node(1);
	Node* node2 = new Node(2);
	Node* node3 = new Node(3);
	Node* node4 = new Node(4);

	Node* node5 = new Node(5);
	Node* node6 = new Node(6);
	node4->SetLeft(node1);
	node4->SetRight(node2);
	node1->SetLeft(node3);
	node1->SetRight(node5);
	node2->SetRight(node6);

	dfs(node4);

	return 0;
}

'CS > Algorithm' 카테고리의 다른 글

Vector  (0) 2021.07.02
Priority Queue  (0) 2021.07.02
Set  (0) 2021.07.02
Map  (0) 2021.07.02

댓글