代码题--C++--二叉树的层序遍历(递归与非递归)

代码题--C++--二叉树的层序遍历(递归与非递归)


题目描述

给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历)
例如:
给定的二叉树是{3,9,20,#,#,15,7},

该二叉树层序遍历的结果是
[
[3],
[9,20],
[15,7]
]

递归实现层序遍历代码:这个函数是直接输出,没有将结果分为每一层。BTreeLevelOrder函数中用循环将每一层的结点分开递归,比如i= 3,代表第三层的结点进入递归函数,然后从根结点遍历到第三层,i-1执行到i=1时,输出该结点,每次将root->当成root传进去,所以会有每个方向的递归。

void _BTreeLevelOrder(BTNode* root, size_t i)
{
    if (root == NULL || i == 0)
    {
        return;
    }
    if (i == 1)
    {
        printf("%d ", root->_data);
        return;
    }
    _BTreeLevelOrder(root->_left, i - 1);
    _BTreeLevelOrder(root->_right, i - 1);
}

void BTreeLevelOrder(BTNode* root)
{
    if (root == NULL)
        return;
    int dep = BTreeDepth(root);
    for (int i = 1; i <= dep; i++)
    {
        _BTreeLevelOrder(root, i);
    }

}

非递归实现,用队列实现:牛客网树中的层序遍历。用两个队列,对应存放该节点以及该节点的层数,从0 开始。具体步骤在代码内有备注。

/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 * };
 */

class Solution {
public:
    /**
     * 
     * @param root TreeNode类 
     * @return int整型vector<vector<>>
     */
    vector<vector<int> > levelOrder(TreeNode* root) {
        // write code here
        vector<vector<int>> vector1;
        if(root == NULL)
        {
            return vector1;
        }
        queue<TreeNode*> queue1;
        queue<int> level;
        queue1.push(root);
        level.push(0);   //存放该队列中对应的结点的层数,0代表第一层结点
        TreeNode* p;
        int tmp =0;   //保存层数
        while(queue1.empty() == false)
        {
            p = queue1.front();
            tmp = level.front();
            queue1.pop();
            level.pop();
            //比如队列中level为1,tmp = 1,如果只插入头结点,为第一层,
            //此时vector1的行数1 < 应该保存的层数(2),那么将一维数组插入二维数组中
            //为了判断应该添加到二维数组的哪一行
            if(vector1.size() < tmp +1 )
            {
                vector<int> vet;
                vector1.push_back(vet);
            }
            //将队列的头的值插入第tmp行队列
            vector1[tmp].push_back(p->val);
            //如果有左子树将左子树入队并且保存这个节点的层数为tmp+1
            //如果有右子树将右子树入队并且保存这个节点的层数为tmp+1
            if( p->left != NULL ) 
            {
                queue1.push(p->left);
                level.push(tmp+1);
            }
            if(p->right != NULL)
            {
                queue1.push(p->right);
                level.push(tmp+1);
            }
        }
        return vector1;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_41103495/article/details/108808506