I'm trying to make a simple program to learn about Binary Tree Traversals in C++. However, when I try to compile my program with make
I get the following error:
Undefined symbols for architecture x86_64:
"Node::postOrderTraversalNode(Node*)", referenced from:
BinaryTree::postOrderTraversal(BinaryTree*) in BinaryTree.o
postOrderTraversalNode(Node*) in Node.o
ld: symbol(s) not found for architecture x86_64
I have looked at other StackExchange posts and have narrowed it down to something having to do with how I set up my makefile
but I still can't seem find the error. Any help would be greatly appreciated.
Makefile:
BinaryTree_Program: Main.o BinaryTree.o Node.o
clang++ BinaryTree.o Node.o Main.o -o BinaryTree_Program
Main.o: Main.cpp
clang++ -c Main.cpp -o Main.o
BinaryTree.o: BinaryTree.h BinaryTree.cpp
clang++ -c BinaryTree.cpp -o BinaryTree.o
Node.o: Node.h Node.cpp
clang++ -c Node.cpp -o Node.o
clean:
rm BinaryTree_Program Main.o BinaryTree.o Node.o
Main.cpp
#include "BinaryTree.h"
#include "Node.h"
int main() {
Node* root = new Node(10);
Node* nd1 = new Node(5);
Node* nd2 = new Node(3);
Node* nd3 = new Node(2);
Node* nd4 = new Node(15);
Node* nd5 = new Node(12);
Node* nd6 = new Node(20);
root->left = nd1;
root->right = nd4;
nd1->left = nd2;
nd1->right = nd3;
nd4->left = nd5;
nd4->right = nd6;
// 10
// / \
// 5 15
// / \ / \
// 3 2 12 20
BinaryTree* tree = new BinaryTree(root);
BinaryTree::inOrderTraversal(tree);
}
BinaryTree.cpp
#include "BinaryTree.h"
#include "Node.h"
// The in, pre, and post is based on where we visit the root
BinaryTree::BinaryTree(Node* nd) {
root = nd;
}
// The in, pre, and post is based on where we visit the root
void BinaryTree::inOrderTraversal(BinaryTree* t) {
if (t != NULL){
Node::inOrderTraversalNode(t->root);
}
}
void BinaryTree::preOrderTraversal(BinaryTree* t) {
if (t != NULL) {
Node::preOrderTraversalNode(t->root);
}
}
void BinaryTree::postOrderTraversal(BinaryTree* t) {
if (t != NULL) {
Node::postOrderTraversalNode(t->root);
}
}
Node.cpp
#include "Node.h"
Node::Node(int d) {
data = d;
left = NULL;
right = NULL;
}
void Node::visitNode(Node* nd) {
std::cout << nd -> data << " " << std::endl;
}
void Node::inOrderTraversalNode(Node* nd) {
if (nd != NULL) {
Node::inOrderTraversalNode(nd -> left);
Node::visitNode(nd);
Node::inOrderTraversalNode(nd -> right);
}
}
void Node::preOrderTraversalNode(Node* nd) {
if (nd != NULL) {
Node::visitNode(nd);
Node::preOrderTraversalNode(nd -> left);
Node::preOrderTraversalNode(nd -> right);
}
}
void postOrderTraversalNode(Node* nd) {
if (nd != NULL){
Node::postOrderTraversalNode(nd -> left);
Node::postOrderTraversalNode(nd -> right);
Node::visitNode(nd);
}
}
Node.h
#ifndef NODE_H
#define NODE_H
#include <iostream>
class Node {
public:
// member data
int data;
Node* left;
Node* right;
// constructor
Node(int d);
// member functions
static void inOrderTraversalNode(Node* nd);
static void preOrderTraversalNode(Node* nd);
static void postOrderTraversalNode(Node* nd);
//static void levelOrderTralversalNode(Node* n);
static void visitNode(Node*);
};
#endif
BinaryTree.h
#ifndef BINARYTREE_H
#define BINARYTREE_H
#include <iostream>
#include "Node.h"
using namespace std;
class BinaryTree {
public:
// member data
Node* root;
// constructor
BinaryTree(Node* n);
// member functions
static void inOrderTraversal(BinaryTree* t);
static void preOrderTraversal(BinaryTree* t);
static void postOrderTraversal(BinaryTree* t);
//void levelOrderTraveral(BinaryTree* t);
};
#endif