剑指offer-面试题23.从上往下打印二叉树
题目:从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印。例如输入图4.5中
的二叉树,则依次打印出8、6、10、5、7、9、11二叉树结点的定义如下:
1 struct BinaryTreeNode 2 { 3 int m_nValue; 4 BinaryTreeNode* m_pLeft; 5 BinaryTreeNode* m_pRight; 6 };
我们以如下二叉树为例:
1 8 2 / \ 3 6 10 4 / \ / \ 5 5 7 9 11
这道题实际上二叉树层次遍历方法:
解题步骤如下:
1.设置一个deque双端队列,将根节点加入队列
2.首先从队头取出根节点,输出根节点的数据值。同时将根节点的左右子结点加入队列,此时队列里面的节点为 6、10
3.从队头取出节点6,同时加入节点6的左右节点到队列尾,此时队列节点10、5、7
4.从队头取出节点10,同时加入节点10的左右节点到对尾,此时队列节点为5、7、9、11
5.此时取出队头节点5,节点5没有左右子节点则输出不必加队列
5。重复直到队列中元素全部取出后,层次遍历便完成了。
代码实现如下:
1 #include <iostream> 2 #include <deque> 3 using namespace std; 4 5 struct BinaryTreeNode 6 { 7 int m_nValue; 8 BinaryTreeNode* m_pLeft; 9 BinaryTreeNode* m_pRight; 10 }; 11 12 13 void CreateTree(BinaryTreeNode** Root) 14 { 15 int data; 16 cin>>data; 17 if(data==0) 18 { 19 *Root=NULL; 20 return; 21 } 22 else 23 { 24 *Root=(BinaryTreeNode*)malloc(sizeof(BinaryTreeNode)); 25 (*Root)->m_nValue=data; 26 CreateTree(&((*Root)->m_pLeft)); 27 CreateTree(&((*Root)->m_pRight)); 28 } 29 } 30 31 32 void PreOrder(BinaryTreeNode* Root) 33 { 34 if(Root==NULL) 35 return; 36 37 PreOrder(Root->m_pLeft); 38 cout<<Root->m_nValue<<endl; 39 PreOrder(Root->m_pRight); 40 } 41 42 void LevelOrder(BinaryTreeNode* Root) 43 { 44 if(Root==NULL) 45 return; 46 47 deque<BinaryTreeNode*> D; 48 49 D.push_back(Root); 50 51 52 while(!D.empty()) 53 { 54 BinaryTreeNode* TempNode=D.front(); 55 D.pop_front(); 56 cout<<TempNode->m_nValue<<","; 57 58 if(TempNode->m_pLeft!=NULL) 59 { 60 D.push_back(TempNode->m_pLeft); 61 } 62 if(TempNode->m_pRight!=NULL) 63 { 64 D.push_back(TempNode->m_pRight); 65 } 66 } 67 } 68 69 int main() 70 { 71 BinaryTreeNode* root; 72 cout<<"Please input the tree node data(0-exit):\n"; 73 CreateTree(&root); 74 cout<<"The PreOrder of Binary Tree:\n"; 75 PreOrder(root); 76 cout<<endl; 77 cout<<"The LevelOrder Of Binary Tree: "; 78 LevelOrder(root); 79 cout<<endl; 80 return 0; 81 }
运行截图:
作者:vpoet
出处:http://www.cnblogs.com/vpoet/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
出处:http://www.cnblogs.com/vpoet/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。