问题(假定根节点位于第0层)
1. 层次遍历二叉树(每层换行分开)
2. 层次遍历二叉树指定的某层
例如
上图中
1.
1 2 3 4 5 6 7 8
2.
第三层 7 8
可以看出得出第二问的解,第一问迎刃而解了,所以从问题二下手
分析与解
1. 层次遍历二叉树指定的某层
可以得出这样的一个结论:遍历二叉树的第k层,相当于遍历二叉树根节点的左右子树的第k-1层。这样一直遍历下去,直到k=0时,输出节点即可。
参考代码
int PrintNodeAtLevel(BiTree root, int level) { if(!root || level < 0) return 0; else if(level == 0) { cout << root->data << endl; return 1; } else return PrintNodeAtLevel(root->left, level - 1) + PrintNodeAtLevel(root->right, level - 1); }
完整执行代码
#include<iostream> using namespace std; typedef struct BiTNode { int data; BiTNode *left; BiTNode *right; }BiTNode, *BiTree; void createTree(BiTree &root) { BiTree left1 = new(BiTNode); BiTree right1 = new(BiTNode); left1->data = 1; left1->left = NULL; left1->right = NULL; right1->data = 2; right1->left = NULL; right1->right = NULL; root->left = left1; root->right = right1; BiTree left2 = new(BiTNode); left2->data = 3; left2->left = NULL; left2->right = NULL; BiTree right2 = new(BiTNode); right2->data = 4; right2->left = NULL; right2->right = NULL; left1->left = left2; left1->right = right2; BiTree left3 = new(BiTNode); left3->data = 5; left3->left = NULL; left3->right = NULL; BiTree right3 = new(BiTNode); right3->data = 6; right3->left = NULL; right3->right = NULL; left2->left = left3; left2->right = right3; } void deleteTree(BiTree root) { if(root) { deleteTree(root->left); deleteTree(root->right); delete(root); root = NULL; } } int PrintNodeAtLevel(BiTree root, int level) { if(!root || level < 0) return 0; else if(level == 0) { cout << root->data << endl; return 1; } else return PrintNodeAtLevel(root->left, level - 1) + PrintNodeAtLevel(root->right, level - 1); } int main() { BiTree root = new(BiTNode); root->data = 0; root->right = root->left = NULL; createTree(root); cout << "Level 0:" << endl; PrintNodeAtLevel(root, 0); cout << "-------------------" << endl; cout << "Level 1:" << endl; PrintNodeAtLevel(root, 1); cout << "-------------------" << endl; cout << "Level 2:" << endl; PrintNodeAtLevel(root, 2); cout << "-------------------" << endl; cout << "Level 3:" << endl; PrintNodeAtLevel(root, 3); cout << "-------------------" << endl; deleteTree(root); }