数据结构与算法学习-二叉树

二叉树是一种特殊的树型结构,它的每一个结点最多只有两个子结点。

二叉树根据子结点的不同可以分为:

1.完全二叉树:如果一棵树的高度为h,那么除了第h层外,其它各层的结点数都达到最大值,第h层有叶子结点,并且叶子结点都是从左到右依次排布。

2.满二叉树:除了叶节点外每一个节点都有左右子叶且叶子结点都处在最底层的二叉树。

3.平衡二叉树:又称AVL树,它是一棵二叉排序树,具有这样的性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

二叉树都有如下性质:

1.二叉树的第i层最多有2^(i-1)个节点;

2.高度为h的二叉树最后又2^h-1个节点;

3.任意一棵二叉树上,其叶子节点个数比度为2的节点数多1。

二叉树的访问方式:

1.先序遍历:对于每个结点,先访问当前结点,然后访问结点的左子树,最后访问结点的右子树。

2.中序遍历:对于每个结点,先访问结点的左子树,然后访问当前结点,最后访问结点的右子树。

3.后序遍历:对于每个结点,先访问结点的左子树,然后访问当前结点的右子树,最后访问当前结点。

实现代码:

#include<iostream>
using namespace std;
class Node {
public:
    int data;
    Node *lchild, *rchild;
    Node(int _data) {
        data = _data;
        lchild = NULL;
        rchild = NULL;
    }
    ~Node() {
        if (lchild != NULL) {
            delete lchild;
        }
        if (rchild != NULL) {
            delete rchild;
        }
    }
    void preorder() {   //先序遍历
        cout << data << " ";
        if (lchild != NULL) {
            lchild->preorder();
        }
        if (rchild != NULL) {
            rchild->preorder();
        }
    }
    void inorder() {    //中序遍历
        if (lchild != NULL) {
            lchild->inorder();
        }
        cout << data << " ";
        if (rchild != NULL) {
            rchild->inorder();
        }
    }
    void postorder()   //后序遍历
    {
        if(lchild!=NULL)
        {
            lchild->postorder();
        }
        if(rchild!=NULL)
        {
            rchild->postorder();
        }
        cout<<data<<" ";
    }
};
class BinaryTree {
private:
    Node *root;
public:
    BinaryTree() {
        root = NULL;
    }
    ~BinaryTree() {
        if (root != NULL) {
            delete root;
        }
    }
    void build_demo() {
        root = new Node(1);
        root->lchild = new Node(2);
        root->rchild = new Node(3);
        root->lchild->lchild = new Node(4);
        root->lchild->rchild = new Node(5);
        root->rchild->rchild = new Node(6);
    }
    void preorder() {
        root->preorder();
    }
    void inorder() {
        root->inorder();
    }
    void postorder()
    {
        root->postorder();
    }
};
int main() {
    BinaryTree binarytree;
    binarytree.build_demo();
    binarytree.preorder();
    cout << endl;
    binarytree.inorder();
    cout << endl;
    binarytree.postorder();
    cout << endl;
    return 0;
}
还有一种复杂的二叉树叫线索二叉树,后面再补上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值