剑指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 }

运行截图:

 

 

posted @ 2015-07-27 20:25  vpoet  阅读(917)  评论(0编辑  收藏  举报