题目分析:
- 二叉树层序遍历实现,要求输出每层的数据信息。
解题思路:
递归实现。
1)判断根节点是否问空,不为空,访问;
2)递归访问当前节点的下一层左子树节点;
3)递归访问当前节点的下一层右子树节点。
非递归实现
利用队列实现,具体方法如下:
1)若树节点非空,则入队;
2)出队,访问当前节点,并将其左右子节点(非空)分别入队;
3)循环执行步骤2),直到队列为空即可。
注意:需要一个变量记录每次节点的数目,这样才能正确输出每次节点信息。
实现程序
//递归实现 void levelTra(TreeNode *root, int level, vector< vector<int> > &result) { // 判断根节点是否为空 if (root == NULL) return ; // 不为空,则访问 if (level == result.size()) { vector<int> temp; result.push_back(temp); } result[level].push_back(root->val); // 递归访问下一层的左、右子树 levelTra(root->left, level + 1, result); levelTra(root->right, level + 1, result); } vector< vector<int> > levelOrder(TreeNode *root) { vector< vector<int> > result; levelTra(root, 0, result); return result; } //非递归实现 vector< vector<int> > levelOrder1(TreeNode *root) { vector< vector<int> > result; if (root == NULL) return result; queue<TreeNode *> que; // 根节点入队 que.push(root); // 循环遍历,直到队列为空 while (!que.empty()) { int size = que.size(); vector<int> help; for (int i = 0; i < size; i++) { TreeNode *temp = que.front(); // 出队 que.pop(); help.push_back(temp->val); // 左子树不为空,则左子树入队 if (temp->left != NULL) que.push(temp->left); // 右子树不为空,则右子树入队 if (temp->right != NULL) que.push(temp->right); } result.push_back(help); } return result; }