题目:从上往下打印出二叉树的每个结点,从一层的结点按照从左往右的顺序打印。
分析:类似于宽度优先搜索。可以采用队列来实现。
8
6 10
5 7 9 11
依次打印:8,6,10,5,7,9,11
首先我们获得根节点,每次打印根节点后,接下来就打印它的左右子树,如上图,先将8压入容器,接下来出队列,并将根节点6、10压入容器,接下来再打印6,并将6的左右子树5、7压入容器,此时由于10先如队列的所以先打印10(同样会将左右字数9、11压入队列),再打印后来进去的5、7.。。
typedef char ElemType; struct BinTree{ ElemType m_root; BinTree *m_left; BinTree *m_right; }; void PrintBinTree(const BinTree *pTreeRoot) { if(!pTreeRoot) return; deque<BinTree *> dequeBinTree; //定义一个存储树结点的队列 dequeBinTree.push_back(pTreeRoot); while(dequeBinTree.size()) { BinTree *pNode=dequeBinTree.front(); //获得定点并打印 cout<<pNode->m_root<<" "; dequeBinTree.pop_front(); //出队列,pop_front() //删除链表头的一元素 if (pNode->m_left) dequeBinTree.push_back(pNode->m_left); if(pNode->m_right) dequeBinTree.push_back(pNode->m_right); } }
步骤总结:
1)把结点放入队列中
2)从队列头部取出结点,打印这个结点后将这个节点所能达到的结点依次从队尾放入队列中
3)重复1)、2)直到队列为空