二叉树

这篇博客介绍了二叉树的定义,包括其特殊性质——每个节点最多有两个子节点。文章详细讲解了如何构造二叉树,并通过结构体表示节点。接着,文章探讨了二叉树的四种遍历方式:前序、中序和后序的递归与非递归实现,举例展示了不同遍历顺序。
摘要由CSDN通过智能技术生成

二叉树是一棵特殊的树,它最多有两个孩子结点,左孩子和右孩子
1.建立二叉树
二叉树一个结点指针所指向的内容包含三项,该结点的值,指向左孩子的指针和指向右孩子的指针。所以需要建立一个结构体包含这三项内容

struct BinaryTreeNode
{
    BinaryTreeNode<T> *_left;//左孩子
    BinaryTreeNode<T> *_right;//右孩子
    T _data;
    BinaryTreeNode(const T& x)
        :_left(NULL)
        , _right(NULL)
        ,_data(x)
    {}
};

构造二叉树可以使用递归的方法来构造

BinaryTree(T* a, size_t n, T invalid)
{
    int index = 0;
    _root = CreateTree(a,n,invalid,index);
}
Node* CreateTree(T* a, int n, T invalid, int& index)
{
    Node* root = NULL;
    if (index < n&&a[index] != invalid)
    {
        root = new Node(a[index]);
        root->_left = CreateTree(a, n, invalid, ++index);//用递归创建子树
        root->_right = CreateTree(a, n, invalid, ++index);
    }
    return root;
}

2.二叉树创建后要实现一些功能
2.1 前序二叉树(递归)
先访问头结点,再访问左孩子,最后访问右孩子
这里写图片描述
该图的遍历顺序应为1 2 3 4 5 6 7

void _PrevOrder(Node* root)
    {

        if (root != NULL)
        {
            cout << root->_data << " ";//先遍历打印根节点
            _PrevOrder(root->_left);   //再遍历左子树
            _PrevOrder(root->_right);  //最后遍历右子树
        }
    }

2.2 前序二叉树(非递归)

void PrevOrderNonR()
    {
        Node* cur = _root;
        stack<Node*> s;
        while (cur || !s.empty())
        {
            while (cur)
            {
                s.push(cur);
                cout << cur->_data << " ";
                cur = cur->_left;
            }
            Node *top = s.top();
            s.pop();
            cur = top->_right;
        }
        cout << endl;
    }

2.3 中序二叉树(递归)
遍历顺序应为3 2 4 1 7 6 5

void _InOrder(Node* root)
    {
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值