层次遍历 二叉树

对于二叉树的层次遍历,本人实现了递归版本与非递归的版本。

要求对于给定的二叉树, 输出的结果为[   [  1   ]  ,  [  2  , 3  ] , [4 , 5 ]   ]

 

注意:只需要将各个层之间的界限确定清楚就好了。

迭代版本:(使用队列,利用空指针作为层与层之间分隔的标记)。

    vector<vector<int> > levelOrder(TreeNode *root) {
        queue<TreeNode *> q;
        TreeNode *temp = root;
        vector<vector<int> > vecs;
        if(root==NULL)return vecs;
        vector<int> vec;
        q.push(temp);
        q.push(NULL);
        TreeNode *prev = NULL;
        while(!q.empty())
        {
            temp = q.front();
            q.pop();
            if(temp == NULL && prev == NULL)
                break;
            if(temp == NULL)
            {
                vecs.push_back(vec);
                vec.clear();
                q.push(NULL);
                prev = temp;
                continue;
            }
            vec.push_back(temp->val);
            if(temp->left)q.push(temp->left);
            if(temp->right)q.push(temp->right);
            prev = temp;
        }
        return vecs;
    }

递归版本:

    void traverse(TreeNode *root, int level, vector<vector<int> > & vecs)
    {
        if(root == NULL)return;
        if(level > vecs.size())vecs.push_back(vector<int>());
        vecs[level-1].push_back(root->val);
        traverse(root->left, level+1, vecs);
        traverse(root->right, level+1, vecs);
    }
    vector<vector<int> > levelOrder(TreeNode *root) {
        vector<vector<int> > vecs;
        traverse(root, 1, vecs);
        return vecs;
    }

上述还可使用两个队列,分别用来存储前一层和后一层的树中的节点。代码如下:

    vector<vector<int> > levelOrder(TreeNode *root) {
        queue<TreeNode *> queue1;
        queue<TreeNode *> queue2;
        vector<vector<int> > allLevels;
        vector<int> level;
        if(root == NULL) return allLevels;
        queue1.push(root);
        while(!queue1.empty())
        {
            TreeNode *temp = queue1.front();
            queue1.pop();
            if(temp->left)queue2.push(temp->left);
            if(temp->right)queue2.push(temp->right);
            level.push_back(temp->val);
            if(queue1.empty())
            {
                swap(queue1,queue2);
                allLevels.push_back(level);
                level.clear();
            }
        }
        return allLevels;
    }


变式:要求将数组从叶子节点开始输出,只需要在上述程序中加上 reverse() 函数即可。

层次遍历二叉树是一种广度优先搜索的算法,它按照从上到下、从左到右的顺序逐层遍历二叉树的节点。下面是一个用C语言实现层次遍历二叉树的示例代码: ```c #include <stdio.h> #include <stdlib.h> // 定义二叉树节点结构 struct TreeNode { int val; struct TreeNode* left; struct TreeNode* right; }; // 创建新节点 struct TreeNode* createNode(int val) { struct TreeNode* newNode = (struct TreeNode*)malloc(sizeof(struct TreeNode)); newNode->val = val; newNode->left = NULL; newNode->right = NULL; return newNode; } // 层次遍历二叉树 void levelOrder(struct TreeNode* root) { if (root == NULL) { return; } // 创建一个队列用于存储待遍历的节点 struct TreeNode** queue = (struct TreeNode**)malloc(sizeof(struct TreeNode*) * 1000); int front = 0; // 队列头指针 int rear = 0; // 队列尾指针 // 将根节点入队 queue[rear++] = root; while (front < rear) { // 出队当前节点并访问 struct TreeNode* node = queue[front++]; printf("%d ", node->val); // 将当前节点的左右子节点入队 if (node->left != NULL) { queue[rear++] = node->left; } if (node->right != NULL) { queue[rear++] = node->right; } } // 释放队列内存 free(queue); } int main() { // 创建二叉树 struct TreeNode* root = createNode(1); root->left = createNode(2); root->right = createNode(3); root->left->left = createNode(4); root->left->right = createNode(5); // 层次遍历二叉树 printf("层次遍历结果:"); levelOrder(root); return 0; } ``` 这段代码中,我们首先定义了一个二叉树节点的结构体`TreeNode`,包含一个整数值`val`和左右子节点的指针。然后,我们实现了一个`createNode`函数用于创建新的节点。接下来,我们定义了一个`levelOrder`函数用于层次遍历二叉树。在该函数中,我们使用一个队列来存储待遍历的节点,初始时将根节点入队,然后循环执行以下操作:出队当前节点并访问,将当前节点的左右子节点入队。最后,我们在`main`函数中创建了一个二叉树,并调用`levelOrder`函数进行层次遍历
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值