Skip to content
cpp
#include "iostream"
#include "list"

using namespace std;

// Binary Tree

struct Node {
    int key;
    Node *left;
    Node *right;

    Node(int k, Node *sx = nullptr, Node *dx = nullptr)
            : key{k}, left{sx}, right{dx} {}
};

typedef Node *PNode;

PNode newTree(int key) {
    PNode t = new Node(key);
    return t;
}

bool treeEmpty(PNode t) {
    return t == nullptr;
}

void insert_left(PNode t, int key) {
    // empty tree
    if(!treeEmpty(t)){
        // left is already present
        if(!treeEmpty(t->left)){
            insert_left(t->left, key);
        }else{
           PNode left_node = newTree(key);
            t->left = left_node;
        }
    }
}

void insert_right(PNode t, int key) {
    if(!treeEmpty(t)){
        // left is already present
        if(!treeEmpty(t->right)){
            insert_left(t->right, key);
        }else{
            PNode right_node = newTree(key);
            t->right = right_node;
        }
    }
}

void visit_DFS(PNode t){
    if(!treeEmpty(t)){
        std::cout << t->key << std::endl;
        visit_DFS(t->left);
        visit_DFS(t->right);
    }
}

void visit_PostOrder(PNode t){
    if(!treeEmpty(t)){
        visit_PostOrder(t->left);
        visit_PostOrder(t->right);
        std::cout << t->key << std::endl;
    }
}

std::pair<int, bool> k_compreso_aux(PNode t, int k, int sum){
    if(t == nullptr){
        std::pair<int,bool> p = {0, true};
        return p;
    }else{
        std::pair<int, bool> left = k_compreso_aux(t->left,  k, sum);
        std::pair<int, bool> right = k_compreso_aux(t->right, k, sum);
        int total = t->key + left.first + right.first;

        if((total >= -k && total <= k) && (left.second && right.second)){
            std::pair<int,bool> p = {total, true};
            return p;
        }else{
            std::pair<int,bool> p = {total, false};
            return p;
        }
    }

}

int k_compreso(PNode t, int k){
    if(t == nullptr){
        return 0;
    }else{
        return k_compreso_aux(t, k, 0).second ? 1 : 0 ;
    }
}

int gradosquil_aux(PNode t){
    if(t == nullptr){
        return 0;
    }else{
        int l = gradosquil_aux(t->left);
        int r = gradosquil_aux(t->right);
        int grado = abs(l-r);

    }
    return 0;
}

int gradosquil(PNode t){
    if (t== nullptr){
        return 0;
    }else{
        return gradosquil_aux(t);
    }
}

int k_limitato(PNode t){

}



PNode test_tree_1(){
    PNode tree = newTree(0);
    insert_left(tree, 1);
    insert_right(tree, 2);
    insert_left(tree->left, 3);
    insert_right(tree->left, 4);
    insert_left(tree->right, 5);
    insert_right(tree->right, 6);
    return tree;
}

PNode test_tree_2(){
    PNode tree = newTree(543);
    insert_left(tree, 12);
    insert_right(tree, 82);
    insert_left(tree->left, 73);
    insert_right(tree->left, 44);
    insert_left(tree->right, 15);
    insert_right(tree->right, 6);
}

PNode test_tree_3(){
    PNode tree = newTree(-3);
    insert_left(tree,  1);
    insert_right(tree, -2);
    insert_left(tree->left, 3);
    insert_right(tree->left, -4);
    insert_left(tree->right, 5);
    insert_right(tree->right, 6);
}

// -- LCRS

struct NodeG {
    int key;
    NodeG* left_child;
    NodeG* right_sib;
    NodeG(int k, NodeG* sx = nullptr, NodeG* dx = nullptr)
            : key{k}, left_child{sx}, right_sib{dx} {}

};

typedef NodeG* PNodeG;

PNodeG newTree2(int key){
    PNodeG t = new NodeG(key);
    return t;
}

void insert_left_child(PNodeG tree, int key){
    if(tree != nullptr){
        if(tree->left_child != nullptr){
            insert_left_child(tree, key);
        }else{
            PNodeG left = newTree2(key);
            tree->left_child = left;
        }
    }
}

void insert_right_sibling(PNodeG tree, int key){
    if(tree != nullptr){
        if(tree->right_sib != nullptr){
            insert_right_sibling(tree->right_sib, key);
        }else{
            PNodeG right = newTree2(key);
            tree->right_sib = right;
        }
    }
}

void Visit_PreOrder(PNodeG tree){
    if(tree == nullptr){
        return ;
    }else{
        cout << "" << tree->key;
        Visit_PreOrder(tree->left_child);
        Visit_PreOrder(tree->right_sib);
    }
}

// Theta(n)
// Preorder Visit on the general tree to verify the existential property of being a leaf
// As we have a general tree, we must iterate through all the nodes to find out whether each node
// is a leaf.
// We must check each node to get our final answer as at any point, a node could be a leaf.
// Thus, be covering the tree exactly once, we perform a Preorder Visit of complexity T(n) = O(n).
int count_leaves(PNodeG tree){
    if(tree == nullptr){
        return 0;
    }else{
        if(tree->left_child== nullptr){
            return 1 + count_leaves(tree->right_sib);
        }else{
            return count_leaves(tree->left_child) + count_leaves(tree->right_sib);
        }
    }
}

int k_completo_aux(PNodeG tree, int k){

}

// Existential property, verify
bool k_completo(PNodeG tree, int k){


}

PNodeG test_tree4(){
    PNodeG tree = newTree2(0);
    insert_left_child(tree, 1);
    insert_right_sibling(tree->left_child, 2);
    insert_left_child(tree->left_child, 3);
    insert_right_sibling(tree->left_child->left_child, 4);
    insert_left_child(tree->left_child->right_sib, 5);
    insert_right_sibling(tree->left_child->right_sib->left_child, 6);
    return tree;
}

PNodeG test_tree5(){
    PNodeG tree = newTree2(0);
    insert_left_child(tree, 1);
    insert_right_sibling(tree->left_child, 2);
    insert_right_sibling(tree->left_child->right_sib, 7);
    insert_left_child(tree->left_child, 3);
    insert_right_sibling(tree->left_child->left_child, 4);
    insert_right_sibling(tree->left_child->left_child->right_sib, 9);
    insert_left_child(tree->left_child->right_sib, 5);
    insert_right_sibling(tree->left_child->right_sib->left_child, 6);
    insert_left_child(tree->left_child->right_sib->left_child, 10);
    return tree;
}

// 4 leaves
PNodeG test_tree6(){
    PNodeG tree = newTree2(0);
    insert_left_child(tree, 1);
    insert_right_sibling(tree->left_child, 2);
    insert_right_sibling(tree->left_child->right_sib, 3);
    insert_left_child(tree->left_child, 4);
    insert_right_sibling(tree->left_child->left_child, 5);
    insert_left_child(tree->left_child->left_child->right_sib, 6);
    return tree;
}

PNodeG test_tree7(){
    PNodeG tree = newTree2(0);
    insert_left_child(tree, 1);
    insert_right_sibling(tree->left_child, 2);
    insert_right_sibling(tree->left_child->right_sib, 3);
    insert_right_sibling(tree->left_child->right_sib->right_sib, 7);
    insert_left_child(tree->left_child, 4);
    insert_right_sibling(tree->left_child->left_child, 5);
    insert_left_child(tree->left_child->left_child->right_sib, 6);
    return tree;
}


int main ()
{
    PNodeG t = test_tree7();
    int a = count_leaves(t);
    cout << " " << a;

    Visit_PreOrder(t);
    return 0;
}
#include "iostream"
#include "list"

using namespace std;

// Binary Tree

struct Node {
    int key;
    Node *left;
    Node *right;

    Node(int k, Node *sx = nullptr, Node *dx = nullptr)
            : key{k}, left{sx}, right{dx} {}
};

typedef Node *PNode;

PNode newTree(int key) {
    PNode t = new Node(key);
    return t;
}

bool treeEmpty(PNode t) {
    return t == nullptr;
}

void insert_left(PNode t, int key) {
    // empty tree
    if(!treeEmpty(t)){
        // left is already present
        if(!treeEmpty(t->left)){
            insert_left(t->left, key);
        }else{
           PNode left_node = newTree(key);
            t->left = left_node;
        }
    }
}

void insert_right(PNode t, int key) {
    if(!treeEmpty(t)){
        // left is already present
        if(!treeEmpty(t->right)){
            insert_left(t->right, key);
        }else{
            PNode right_node = newTree(key);
            t->right = right_node;
        }
    }
}

void visit_DFS(PNode t){
    if(!treeEmpty(t)){
        std::cout << t->key << std::endl;
        visit_DFS(t->left);
        visit_DFS(t->right);
    }
}

void visit_PostOrder(PNode t){
    if(!treeEmpty(t)){
        visit_PostOrder(t->left);
        visit_PostOrder(t->right);
        std::cout << t->key << std::endl;
    }
}

std::pair<int, bool> k_compreso_aux(PNode t, int k, int sum){
    if(t == nullptr){
        std::pair<int,bool> p = {0, true};
        return p;
    }else{
        std::pair<int, bool> left = k_compreso_aux(t->left,  k, sum);
        std::pair<int, bool> right = k_compreso_aux(t->right, k, sum);
        int total = t->key + left.first + right.first;

        if((total >= -k && total <= k) && (left.second && right.second)){
            std::pair<int,bool> p = {total, true};
            return p;
        }else{
            std::pair<int,bool> p = {total, false};
            return p;
        }
    }

}

int k_compreso(PNode t, int k){
    if(t == nullptr){
        return 0;
    }else{
        return k_compreso_aux(t, k, 0).second ? 1 : 0 ;
    }
}

int gradosquil_aux(PNode t){
    if(t == nullptr){
        return 0;
    }else{
        int l = gradosquil_aux(t->left);
        int r = gradosquil_aux(t->right);
        int grado = abs(l-r);

    }
    return 0;
}

int gradosquil(PNode t){
    if (t== nullptr){
        return 0;
    }else{
        return gradosquil_aux(t);
    }
}

int k_limitato(PNode t){

}



PNode test_tree_1(){
    PNode tree = newTree(0);
    insert_left(tree, 1);
    insert_right(tree, 2);
    insert_left(tree->left, 3);
    insert_right(tree->left, 4);
    insert_left(tree->right, 5);
    insert_right(tree->right, 6);
    return tree;
}

PNode test_tree_2(){
    PNode tree = newTree(543);
    insert_left(tree, 12);
    insert_right(tree, 82);
    insert_left(tree->left, 73);
    insert_right(tree->left, 44);
    insert_left(tree->right, 15);
    insert_right(tree->right, 6);
}

PNode test_tree_3(){
    PNode tree = newTree(-3);
    insert_left(tree,  1);
    insert_right(tree, -2);
    insert_left(tree->left, 3);
    insert_right(tree->left, -4);
    insert_left(tree->right, 5);
    insert_right(tree->right, 6);
}

// -- LCRS

struct NodeG {
    int key;
    NodeG* left_child;
    NodeG* right_sib;
    NodeG(int k, NodeG* sx = nullptr, NodeG* dx = nullptr)
            : key{k}, left_child{sx}, right_sib{dx} {}

};

typedef NodeG* PNodeG;

PNodeG newTree2(int key){
    PNodeG t = new NodeG(key);
    return t;
}

void insert_left_child(PNodeG tree, int key){
    if(tree != nullptr){
        if(tree->left_child != nullptr){
            insert_left_child(tree, key);
        }else{
            PNodeG left = newTree2(key);
            tree->left_child = left;
        }
    }
}

void insert_right_sibling(PNodeG tree, int key){
    if(tree != nullptr){
        if(tree->right_sib != nullptr){
            insert_right_sibling(tree->right_sib, key);
        }else{
            PNodeG right = newTree2(key);
            tree->right_sib = right;
        }
    }
}

void Visit_PreOrder(PNodeG tree){
    if(tree == nullptr){
        return ;
    }else{
        cout << "" << tree->key;
        Visit_PreOrder(tree->left_child);
        Visit_PreOrder(tree->right_sib);
    }
}

// Theta(n)
// Preorder Visit on the general tree to verify the existential property of being a leaf
// As we have a general tree, we must iterate through all the nodes to find out whether each node
// is a leaf.
// We must check each node to get our final answer as at any point, a node could be a leaf.
// Thus, be covering the tree exactly once, we perform a Preorder Visit of complexity T(n) = O(n).
int count_leaves(PNodeG tree){
    if(tree == nullptr){
        return 0;
    }else{
        if(tree->left_child== nullptr){
            return 1 + count_leaves(tree->right_sib);
        }else{
            return count_leaves(tree->left_child) + count_leaves(tree->right_sib);
        }
    }
}

int k_completo_aux(PNodeG tree, int k){

}

// Existential property, verify
bool k_completo(PNodeG tree, int k){


}

PNodeG test_tree4(){
    PNodeG tree = newTree2(0);
    insert_left_child(tree, 1);
    insert_right_sibling(tree->left_child, 2);
    insert_left_child(tree->left_child, 3);
    insert_right_sibling(tree->left_child->left_child, 4);
    insert_left_child(tree->left_child->right_sib, 5);
    insert_right_sibling(tree->left_child->right_sib->left_child, 6);
    return tree;
}

PNodeG test_tree5(){
    PNodeG tree = newTree2(0);
    insert_left_child(tree, 1);
    insert_right_sibling(tree->left_child, 2);
    insert_right_sibling(tree->left_child->right_sib, 7);
    insert_left_child(tree->left_child, 3);
    insert_right_sibling(tree->left_child->left_child, 4);
    insert_right_sibling(tree->left_child->left_child->right_sib, 9);
    insert_left_child(tree->left_child->right_sib, 5);
    insert_right_sibling(tree->left_child->right_sib->left_child, 6);
    insert_left_child(tree->left_child->right_sib->left_child, 10);
    return tree;
}

// 4 leaves
PNodeG test_tree6(){
    PNodeG tree = newTree2(0);
    insert_left_child(tree, 1);
    insert_right_sibling(tree->left_child, 2);
    insert_right_sibling(tree->left_child->right_sib, 3);
    insert_left_child(tree->left_child, 4);
    insert_right_sibling(tree->left_child->left_child, 5);
    insert_left_child(tree->left_child->left_child->right_sib, 6);
    return tree;
}

PNodeG test_tree7(){
    PNodeG tree = newTree2(0);
    insert_left_child(tree, 1);
    insert_right_sibling(tree->left_child, 2);
    insert_right_sibling(tree->left_child->right_sib, 3);
    insert_right_sibling(tree->left_child->right_sib->right_sib, 7);
    insert_left_child(tree->left_child, 4);
    insert_right_sibling(tree->left_child->left_child, 5);
    insert_left_child(tree->left_child->left_child->right_sib, 6);
    return tree;
}


int main ()
{
    PNodeG t = test_tree7();
    int a = count_leaves(t);
    cout << " " << a;

    Visit_PreOrder(t);
    return 0;
}