【算法百题之十一】二叉树的深度优先遍历
大家好,我是Lampard~~
很高兴又能和大家见面了,接下来准备系列更新的是算法题,一日一练,早日升仙!
今天的问题是:
实现二叉树的深度优先遍历。
我的思路:
实现深度遍历,我们希望输出的结果是:A,B,G,F,Z,E,D,C
为了实现这一功能,我们可以利用栈这个小帮手来完成。
我们可以利用栈先入后出的特性,把右子树先压入栈,
然后把左子树后入栈,继而输出,这样就可以达到深度遍历的效果。
相关代码:
void BinaryTree::ShenDu()
{
// 深度遍历的实现
stack<BinaryTreeNode*> myStack;
myStack.push(root);
BinaryTreeNode* node;
while (myStack.size() != 0)
{
node = myStack.top();
cout << node->getData() << " ";
myStack.pop();
if (node->getRightChild() != NULL)
myStack.push(node->getRightChild());
if (node->getLeftChild() != NULL)
myStack.push(node->getLeftChild());
}
}
我们需要node这个暂存栈顶元素的变量是因为:
我们要在两个if之前把栈顶元素出栈,不然的话一旦发现有符合的元素,
栈顶的元素就会换了个人,这样会使整个程序无限循环。
如果我们想构造一个上图的树的话,我们前序插入元素的顺序应该是:
A,B,G, # , #,F, Z, #,#,E,#,#,D,#,C,#,#
具体的创造函数请看算法百题之九
测试代码:
cout << endl;
cout << "深度优先遍历的结果为:" << endl;
myTree->ShenDu();
测试结果: