题目如下:
这道题是求二叉树的层次遍历,也即宽度优先遍历,并将结果以二维数组形式输出。
因为树的每一层节点数可能不同,所以采用二维不定长的vector向量储存
采用递归方式求解,找完一层找下一层
输入在下面的程序前需要处理一下,采用先序建树,遇到叶子节点时将左右孩子置零,例如题目中的树,输入时输入:
3 9 0 0 20 15 0 0 7 0 0
完整代码如下:
#include<bits/stdc++.h>
using namespace std;
vector< vector<int> > result;
typedef struct TreeNode{
struct TreeNode* left;
struct TreeNode* right;
int elem;
};
TreeNode* BinaryTreeCreate() //先序建树
{
int x;
TreeNode *p;
cin >> x;
if(x == 0)
{
p = NULL;
}
else
{
p = (TreeNode*)malloc(sizeof(TreeNode));
p->left = BinaryTreeCreate();
p->elem = x;
p->right = BinaryTreeCreate();
}
return p;
}
int DepthOfTree(TreeNode* root) //求树的深度
{
if(!root) return 0;
int leftDepth = DepthOfTree(root->left);
int rightDepth = DepthOfTree(root->right);
return leftDepth > rightDepth ? leftDepth+1 : rightDepth+1;
}
void LevelOrderTraversal(TreeNode* root, int level) //层级遍历
{
if(!root) return;
if(level > DepthOfTree(root)+1) return;
if(result.size() == level)
result.push_back(vector<int>());
result[level].push_back(root->elem); //同一层的存到同一维度
LevelOrderTraversal(root->left, level+1);
LevelOrderTraversal(root->right, level+1);
}
int main()
{
TreeNode* inorder = BinaryTreeCreate();
LevelOrderTraversal(inorder, 0);
for(int i = 0; i < DepthOfTree(inorder); i++)
{
for(int j = 0; j < result[i].size(); j++)
{
cout << result[i][j] << ' ';
}
cout<<endl;
}
return 0;
}
运行结果如下: