問題(假定根節點位於第0層)ios
1. 層次遍歷二叉樹(每層換行分開)ide
2. 層次遍歷二叉樹指定的某層spa
例如3d
上圖中指針
1.code
1 2 3 4 5 6 7 8
2.blog
第三層 7 8
能夠看出得出第二問的解,第一問迎刃而解了,因此從問題二下手隊列
分析與解io
1. 層次遍歷二叉樹指定的某層event
能夠得出這樣的一個結論:遍歷二叉樹的第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); }
執行結果
2. 層次遍歷二叉樹
解法1——根據求得的層次,遍歷每一層
參考代碼
void TranverseTree(BiTree root) { for(int i = 0; i < Height(root); ++i) { PrintNodeAtLevel(root, i); cout << "_____________________________" << endl; } }
完整執行程序
#include<iostream> using namespace std; typedef struct BiTNode { int data; BiTNode *left; BiTNode *right; }BiTNode, *BiTree; int maxDis = 0; 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 Height(BiTree root) { if(root == NULL) return 0; else return Height(root->left) > Height(root->right) ? Height(root->left)+1 : Height(root->right) + 1; } void TranverseTree(BiTree root) { for(int i = 0; i < Height(root); ++i) { PrintNodeAtLevel(root, i); cout << "_____________________________" << endl; } } int main() { BiTree root = new(BiTNode); root->data = 0; root->right = root->left = NULL; createTree(root); TranverseTree(root); deleteTree(root); }
執行結果
解法2——無需求得層次,根據遍歷每層的返回信息肯定遍歷
參考代碼
void TranverseTree(BiTree root) { for(int i = 0; ; ++i) { if(!PrintNodeAtLevel(root, i)) break; cout << "_____________________________" << endl; } }
完整執行代碼
#include<iostream> using namespace std; typedef struct BiTNode { int data; BiTNode *left; BiTNode *right; }BiTNode, *BiTree; int maxDis = 0; 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); } void TranverseTree(BiTree root) { for(int i = 0; ; ++i) { if(!PrintNodeAtLevel(root, i)) break; cout << "_____________________________" << endl; } } int main() { BiTree root = new(BiTNode); root->data = 0; root->right = root->left = NULL; createTree(root); TranverseTree(root); deleteTree(root); }
執行結果
解法3——無需求每次都從根提及,一次遍歷成功
能夠看出,解法一、2每次都須要從根提及,還能夠不從跟談起,一次遍歷全部的節點,不過這須要額外的存儲空間
思路
定義兩個指針:cur、last.cur指向目前該訪問的節點位置,last指向目前隊列中最後一個元素的後一個位置
遍歷每一層時,遍歷每個元素是cur日後移動,同時把cur指向的左右孩子加入到隊列中,當cur==last時說明該層已經遍歷完事了。
參考代碼
void TranverseTree(BiTree root) { vector<BiTree> vec; vec.push_back(root); int cur =0, last = 1; while(cur < vec.size()) { last = vec.size(); while(cur < last) { cout << vec[cur]->data << " "; if(vec[cur]->left) vec.push_back(vec[cur]->left); if(vec[cur]->right) vec.push_back(vec[cur]->right); ++cur; } cout << endl; } }
完整執行代碼
#include <iostream> #include <vector> using namespace std; typedef struct BiTNode { int data; BiTNode *left; BiTNode *right; }BiTNode, *BiTree; int maxDis = 0; 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; } } void TranverseTree(BiTree root) { vector<BiTree> vec; vec.push_back(root); int cur =0, last = 1; while(cur < vec.size()) { last = vec.size(); while(cur < last) { cout << vec[cur]->data << " "; if(vec[cur]->left) vec.push_back(vec[cur]->left); if(vec[cur]->right) vec.push_back(vec[cur]->right); ++cur; } cout << endl; } } int main() { BiTree root = new(BiTNode); root->data = 0; root->right = root->left = NULL; createTree(root); TranverseTree(root); deleteTree(root); }
執行結果
C語言寫的
void LevelTraverse(BinaryTreeNode *root) { if(root == NULL) return; BinaryTreeNode* a[MAXSIZE]; a[0] = root; int beg = 0; //表示該層的第一個元素 int end = 0; //表示該層的最後一個元素 int pos_end = 0; //表示目前訪問的元素存放的位置 while(beg <= end) { if(a[beg]->m_pLeft != NULL) a[++pos_end] = a[beg]->m_pLeft; if(a[beg]->m_pRight != NULL) a[++pos_end] = a[beg]->m_pRight; cout << a[beg]->m_nValue << " "; ++beg; if(beg > end) { end = pos_end; cout << endl; } } }
之字形打印
例子:例子中打印
1 2 3 6 5 4 7
參考
#include <iostream> #include <vector> using namespace std; struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int v) : val(v), left(NULL), right(NULL){}; }; void LevelTranverse(TreeNode *root) { if (root == NULL) return; vector<TreeNode *> vec; vec.push_back(root); int beg = 0; int end = vec.size(); bool L2R = false; while (beg != end) { if (L2R) { for(; beg != end; ++beg) { cout << vec[beg]->val << " "; if (vec[beg]->left != NULL) vec.push_back(vec[beg]->left); if (vec[beg]->right != NULL) vec.push_back(vec[beg]->right); } } else { for(int j = beg, k = end-1; k >= beg; ++j, --k) { cout << vec[k]->val << " "; if (vec[j]->left != NULL) vec.push_back(vec[j]->left); if (vec[j]->right != NULL) vec.push_back(vec[j]->right); } beg = end; } end = vec.size(); L2R ^= true; cout << "\n--------------" << endl; } } int main() { TreeNode *root = new TreeNode(0); TreeNode *p1 = new TreeNode(1); TreeNode *p2 = new TreeNode(2); root->left = p1; root->right = p2; TreeNode *p3 = new TreeNode(3); TreeNode *p4 = new TreeNode(4); p1->left = p3; p1->right = p4; TreeNode *p5 = new TreeNode(5); TreeNode *p6 = new TreeNode(6); p2->left = p5; p2->right = p6; TreeNode *p7 = new TreeNode(7); TreeNode *p8 = new TreeNode(8); p3->left = p7; p3->right = p8; TreeNode *p9 = new TreeNode(9); p4->right = p9; LevelTranverse(root); }