由前序和中序得到后序和层次遍历 如何层次遍历 创建二叉树

BTNode* BinaryTree::hy(char* pre, char* mid, int length) {//pre和mid分别是前序和中序的数组
//length是数组的长度,length的作用就是最后的时候叶节点的的孩子返回NULL结束递归
    if (length == 0)
        return NULL;
    char temp = pre[0];//这个temp是根节点//temp存储每一次递归的根结点,也就是方法返回的节点
    
    int index = 0;
    while (mid[index] != temp) {
        index++;//找到根节点在中序遍历中的下标
    }
    BTNode* node = new BTNode(temp);//此时的node为根节点
    node->leftChild = hy(pre + 1, mid, index);
    node->rightChild = hy(pre + index + 1, mid + index + 1, length - index - 1);
    return node;
    
    }

 

7aae1d4eb5814fa9801120efca20dd93.png 

对于二叉树的层次遍历:

 

void BinaryTree::levelOrder(BTNode* node) {//以node为根结点进行遍历
    BTNode* temp;
    if (node == NULL)
    {
        return;
    }
    queue<BTNode*>q;//定义一个队列
    q.push(node);
    while (!q.empty())
    {
        //取出队列的头节点
        temp = q.front();
        q.pop();

        str[tree++] = temp->data;
        if (temp->leftChild !=NULL)q.push(temp->leftChild);
        if (temp->rightChild!=NULL)q.push(temp->rightChild);
    }
    
}

5648ea08fbec44cbb36f8b88219bcbfe.png

 

若给出一个数组,我们如何根据数组创建二叉树:

 void BinaryTree::creatBinaryTree(BTNode* node, string s, int index) {//形参index是形参node的下标

//经过一次这个方法创造了node的左右子节点,输入s的作用就是判断长度是否够用

//注意第一个index从1开始
    if (2 * index < s.length()) {//判断接下来还有没有左子节点
        BTNode* node1 = new BTNode(s[2 * index]);
        node->leftChild = node1;//注意不仅要创造节点,而且也要将父母节点与孩子节点产生连接
        creatBinaryTree(node->leftChild, s, 2 * index);
    }
    if (2 * index + 1 < s.length()) {//判断接下来还有没有右子节点
        BTNode* node2 = new BTNode(s[2 * index + 1]);
        node->rightChild = node2;
        creatBinaryTree(node->rightChild, s, 2 * index + 1);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值