二叉树(创建,遍历) c++版

#include<iostream>
#include<queue>
using namespace std;
struct BTreeNode{
    int m_data;
    BTreeNode* m_pLeft;
    BTreeNode* m_pRight;
};

// 使用前序和中序遍历创建唯一确定二叉树
//preOrder 前序遍历序列
//inOrder 中序遍历序列
//nLen 总的节点数
/*
    1.判断所输入的序列是否符合要求
    2.取出rootdata, 创建根节点,判断只有一个节点的情况
    3.在中序序列中找到root节点,算出左子树节点数, 如果没找到root报错
    4.构建左子树, 构建右子树
*/
BTreeNode* construct(int* preOrder, int* inOrder, int nLen)
{
    if(preOrder==NULL || inOrder==NULL || nLen<=0)
    {
        return NULL;
    }
    int rootdata = preOrder[0];
    BTreeNode* root = new BTreeNode;
    root->m_data = rootdata;
    root->m_pLeft = root->m_pRight = NULL;
    if(nLen==1 && *preOrder == *inOrder)
        return root;
    //中序遍历部分
    int* rmo = inOrder;
    int nLeft = 0;
    while(*rmo != rootdata && rmo <= (inOrder+nLen -1))
    {
        ++rmo;
        ++nLeft;
    }
    if(*rmo!=rootdata)
    {
        return NULL;
    }
    if(nLeft>0)
        root->m_pLeft = construct(preOrder+1, inOrder, nLeft);
    if(nLen-nLeft-1>0)
        root->m_pRight = construct(preOrder+nLeft+1, rmo+1, nLen-nLeft-1);
    return root;
}

//先序遍历
void preOrder(BTreeNode* root)
{   
   
    if(root==NULL)
        return;
    cout<<"-"<<root->m_data;
    preOrder(root->m_pLeft);
    preOrder(root->m_pRight);
}
//中序遍历
void inOrder(BTreeNode* root)
{
    
    if(root==NULL)
        return;
    inOrder(root->m_pLeft);
    cout<<"-"<<root->m_data;
    inOrder(root->m_pRight);
}
//后序遍历
void postOrder(BTreeNode* root)
{
    
    if(root==NULL)
        return;
    postOrder(root->m_pLeft);
    postOrder(root->m_pRight);
    cout<<"-"<<root->m_data;
}
//广度优先
void breadthTravel(BTreeNode* root)
{
    if(root==NULL)
        return;
    queue<BTreeNode*> q;
    q.push(root);
    while(!q.empty())
    {
        BTreeNode* r = q.front();
        cout<<" "<<r->m_data;
        q.pop();
        if(r->m_pLeft)
            q.push(r->m_pLeft);
        if(r->m_pRight)
            q.push(r->m_pRight);
    }

}



int main()
{
    int pOrder[8]={1,2,4,7,3,5,6,8};
    //中根序列
    int iOrder[8]={4,7,2,1,5,3,8,6};
    //建树
    BTreeNode* root=construct(pOrder,iOrder,8);
    cout<<"******************"<<endl;
    cout<<"******************"<<endl;
    cout<<"先序遍历"<<endl;
    preOrder(root);
    cout<<"中序遍历"<<endl;
    inOrder(root);
    cout<<"后序遍历"<<endl;
    postOrder(root);
    cout<<"广度优先"<<endl;
    breadthTravel(root);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二叉树的层序遍历是指按照从上到下、从左到右的顺序访问二叉树的节点,并将节点按层级分组。对于给定的二叉树,我们可以使用队列来实现层序遍历。 以下是一个使用队列进行二叉树层序遍历C++代码示例: ```c++ class Solution { public: vector<vector<int>> levelOrder(TreeNode* root) { vector<vector<int>> result; queue<TreeNode*> que; if (root != nullptr) { que.push(root); } while (!que.empty()) { vector<int> temp; int length = que.size(); for (int i = 0; i < length; i++) { TreeNode* tempNode = que.front(); que.pop(); temp.push_back(tempNode->val); if (tempNode->left) { que.push(tempNode->left); } if (tempNode->right) { que.push(tempNode->right); } } result.push_back(temp); } return result; } }; ``` 以上代码实现了一个名为`levelOrder`的函数,该函数接受一个二叉树的根节点作为参数,并返回一个二维向量,表示二叉树的层序遍历结果。在函数内部,我们首先创建一个空的二维向量`result`用于存储结果,然后创建一个队列`que`用于辅助遍历。如果给定的二叉树不为空,我们将根节点入队。接下来,我们使用循环来遍历队列中的节点,并将节点的值存储到一个临时向量`temp`中。在遍历过程中,如果当前节点有左子节点,我们将左子节点入队;如果当前节点有右子节点,我们将右子节点入队。当遍历完一层后,我们将临时向量`temp`存储到结果向量`result`中,并继续下一层的遍历。最后,我们返回结果向量`result`。 希望以上解答对您有帮助!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [二叉树的层次遍历C++)](https://blog.csdn.net/weixin_42817333/article/details/125110191)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值