面试题23:从上往下打印二叉树
题目:从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印。例如输入图4.5中的二叉树,则依次打印出8、6、10、5、7、9、11。
二叉树结点的定义如下:
struct BinaryTreeNode
{int value;BinaryTreeNode *lchild;BinaryTreeNode *rchild;
};
思路:
每一次打印一个结点的时候,如果该结点有子结点,则把该结点的子结点放到一个队列的末尾。接下来到队列的头部取出最早进入队列的结点,重复前面的打印操作,直至队列中所有的结点都被打印出来为止。
代码如下:
void PrintFromTopToBottom(BinaryTreeNode *pTreeRoot)
{if (!pTreeRoot) return;deque<BinaryTreeNode *> dequeTreeNode;dequeTreeNode.push_back(pTreeRoot);while (dequeTreeNode.size()){BinaryTreeNode *pNode = dequeTreeNode.front();dequeTreeNode.pop_front();cout << pNode->value << " ";if (pNode->lchild) dequeTreeNode.push_back(pNode->lchild);if (pNode->rchild) dequeTreeNode.push_back(pNode->rchild);}
}
本题考点:
● 考查思维能力。按层从上到下遍历二叉树,这对很多应聘者是个新概念,要在短时间内想明白遍历的过程不是一件容易的事情。应聘者通过具体的例子找出其中的规律并想到基于队列的算法,是解决这个问题的关键所在。
● 考查应聘者对二叉树及队列的理解。