代码题--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;
}
};