題目如下:
這道題是求二叉樹的層次遍歷,也即寬度優先遍歷,並將結果以二維數組形式輸出。
因爲樹的每一層節點數可能不同,所以採用二維不定長的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;
}
運行結果如下: