Binary Tree

#include <iostream>
using namespace std;

class BinaryTree {
    private:
        struct treenode{
            int key;
            treenode *left, *right;
            treenode (int k, treenode *l = 0, treenode *r = 0)
                : key(k), left(l), right(r) {}
        };  //  treenode
        treenode * head;
    public:
        BinaryTree() : head(NULL) {}
        //  destructor
        ~BinaryTree() {
            clear(head);
        }
        const treenode * getHead() const {
            return head;
        }
        void clear(treenode * t) {
            if (t) {
                clear(t->left);
                clear(t->right);
                delete t;
            }
        }

        //  insert a new node with some key into the tree
        void insert(int k);
        //  remove a node with some key
        void remove(int k);
        //  return max key
        int max() const;
        //  return min key
        int min() const;
        //  search wheather there is some key existing
        bool search(int k) const;
        //  print the key in preorder
        void preorder(const treenode * t) const;
        //  print the key in inorder
        void inorder(const treenode * t) const;
        //  print the key in postorder
        void postorder(const treenode * t) const;
};

void BinaryTree::insert(int k) {
    if (!head) {
        head = new treenode(k);
        return;
    }  //  if head is null, creat a head with the key
    treenode * temp = head;
    while (1) {  //  find a proper position that is empty where we place k
        if (k < temp->key) {
            if (temp->left) {
                temp = temp->left;
            } else {
                temp->left = new treenode(k, 0, 0);
                break;
            }
        } else {
            if (temp->right) {
                temp = temp->right;
            } else {
                temp->right = new treenode(k, 0, 0);
                break;
            }
        }
    }
}

void BinaryTree::remove(int k) {
    //  temp is the node to be delete
    treenode *temp = head, *parent = head;
    while (temp && temp->key != k) {
        parent = temp;
        if (k < temp->key)
            temp = temp->left;
        else
            temp = temp->right;
    }  //  find the treenode to be delete, name it temp

    if (!temp->left) {  //  if temp has no left treenode
        if (parent == head) {
            head = temp->right;
            delete temp;
        } else if (parent->left == temp) {
            parent->left = temp->right;
        } else {
            parent->right = temp->right;
        }
    } else if (!temp->right) {  //  if temp has no right treenode
        if (parent == head) {
            head = temp->left;
            delete temp;
        } else if (parent->left == temp) {
            parent->left = temp->left;
        } else {
            parent->right = temp->left;
        }
    } else {
        //  find successor and its parent
        treenode *successor = temp, *p = temp;
        while (successor->left) {
            p = successor;
            successor = successor->left;
        }
        //  replace temp with successor
        temp->key = successor->key;
        //  let successor's right become successor's parent's child
        if (p->left == successor) {
            p->left = successor->right;
        } else {
            p->right = successor->right;
        }
        delete successor;
    }
}

int BinaryTree::max() const {  //  the rightest element is the minimum
    if (head) {
        treenode * temp = head;
        while (temp->right) {
            temp = temp->right;
        }
        return temp->key;
    }
}

int BinaryTree::min() const {  //  the leftest element is the minimum
    if (head) {
        treenode * temp = head;
        while (temp->left) {
            temp = temp->left;
        }
        return temp->key;
    }
}

bool BinaryTree::search(int k) const {
    treenode * temp = head;
    while (temp) {
        if (k == temp->key) return true;  //  find it and return true
        if (k < temp->key)
            temp = temp->left;
        else
            temp = temp->right;
    }
    return false;  //  if k not exists, return false
}

void BinaryTree::preorder(const treenode * t) const {
    if (t) {
        cout << t->key << " ";
        preorder(t->left);
        preorder(t->right);
    }
}

void BinaryTree::inorder(const treenode * t) const {
    if (t) {
        inorder(t->left);
        cout << t->key << " ";
        inorder(t->right);
    }
}

void BinaryTree::postorder(const treenode * t) const {
    if (t) {
        postorder(t->left);
        postorder(t->right);
        cout << t->key << " ";
    }
}


//main function for test
int main() {
    BinaryTree test;
    int arr[10] = {9, -2, 3, 10, 4, 26, -9, 0, 5, 11};
    for (int i = 0; i < 10; i++)
        test.insert(arr[i]); 

    cout << arr[2] << " is in the tree?"
         << (test.search(arr[2]) ? " Yes." : " No.") << endl;

    test.preorder(test.getHead());
    cout << endl; 

    test.inorder(test.getHead());
    cout << endl;

    test.postorder(test.getHead());
    cout << endl;
    /*       9                      9
       -2        10           -2         10
     -9   3    11  26  ->  -9    4     11  26
         0 4                    0 5
            5                                */
    test.remove(arr[2]);  //  arr[2] == 3
    cout << arr[2] << " is in the tree?"
         << (test.search(arr[2]) ? " Yes." : " No.") << endl;

    test.inorder(test.getHead());
    cout << endl;

    test.remove(arr[7]);  //  arr[7] == 0
    test.inorder(test.getHead());
    cout << endl;

    return 0;
}

Reasult :
3 is in the tree? Yes.
9 -2 -9 3 0 4 5 10 26 11
-9 -2 0 3 4 5 9 10 11 26
-9 0 5 4 3 -2 11 26 10 9
3 is in the tree? No.
-9 -2 0 4 5 9 10 11 26
-9 -2 4 5 9 10 11 26


Process exited after 0.01723 seconds with return value 0
请按任意键继续…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值