Depth-First Search and Breadth-First Search
class Node{
int value;
Node *parent;
std::vector<Node*> childs;
public:
Node(int v):value(v){
}
void AppendChild(Node* n){
n->parent=this;
childs.push_back(n);
}
void RemoveChild(Node* n){
n->parent=nullptr;
this->childs.erase(std::find(childs.begin(),childs.end(),n));
}
void AppendChilds(std::initializer_list<Node*> childs){
for(Node* n:childs)
this->AppendChild(n);
}
std::vector<Node*> GetChildren(){
return childs;
}
Node* GetParent(){
return parent;
}
Node* GetRoot(){
Node* root=this;
while(root->GetParent())
root=parent->GetParent();
return root;
}
operator int(){
return value;
}
};
void DFS(Node* root){
qDebug()<<*root;
std::vector<Node*> nodes=root->GetChildren();
for(Node* n:nodes)
DFS(n);
}
void BFS(Node* root){
std::queue<Node*> nodes;
nodes.push(root);
while(nodes.size()>0){
Node* current=nodes.front();
nodes.pop();
qDebug()<<*current;
for(Node* n : current->GetChildren())
nodes.push(n);
}
}
int main(int argc, char *argv[])
{
QGuiApplication a(argc, argv);
Node n1=1,n2=2,n3=3,n4=4,n5=5,n6=6,n7=7,n8=8,n9=9,n10=10,n11=11,n12=12,n13=13,n14=14,n15=15,n16=16,n17=17,n18=18,n19=19;
n1.AppendChilds({&n2,&n3});
n2.AppendChilds({&n4,&n5});
n3.AppendChilds({&n6,&n7});
n4.AppendChilds({&n8,&n9});
n5.AppendChilds({&n10,&n11});
n6.AppendChilds({&n12,&n13});
n7.AppendChilds({&n14,&n15});
n8.AppendChilds({&n16,&n17});
n9.AppendChilds({&n18,&n19});
BFS(&n1);
return a.exec();
}
Binary Tree Traversals
struct Node {
int data;
struct Node *left, *right;
Node(int data)
{
this->data = data;
left = right = NULL;
}
};
/* Given a binary tree, print its nodes according to the
"bottom-up" postorder traversal. */
void printPostorder(struct Node* node)
{
if (node == NULL)
return;
// first recur on left subtree
printPostorder(node->left);
// then recur on right subtree
printPostorder(node->right);
// now deal with the node
cout << node->data << " ";
}
/* Given a binary tree, print its nodes in inorder*/
void printInorder(struct Node* node)
{
if (node == NULL)
return;
/* first recur on left child */
printInorder(node->left);
/* then print the data of node */
cout << node->data << " ";
/* now recur on right child */
printInorder(node->right);
}
/* Given a binary tree, print its nodes in preorder*/
void printPreorder(struct Node* node)
{
if (node == NULL)
return;
/* first print data of node */
cout << node->data << " ";
/* then recur on left sutree */
printPreorder(node->left);
/* now recur on right subtree */
printPreorder(node->right);
}
/* Driver program to test above functions*/
int main()
{
struct Node* root = new Node(1);
root->left = new Node(2);
root->right = new Node(3);
root->left->left = new Node(4);
root->left->right = new Node(5);
cout << "\nPreorder traversal of binary tree is \n";
printPreorder(root);
cout << "\nInorder traversal of binary tree is \n";
printInorder(root);
cout << "\nPostorder traversal of binary tree is \n";
printPostorder(root);
return 0;
}
Arithmetic Expression Tree
after that we can calculate the tree by postfix or post-order