参考自:
http://www.cnblogs.com/lscheng/archive/2013/09/11/3313947.html
http://blog.csdn.net/zhonghua18517/article/details/28238261
1、二叉树深度优先遍历是什么样的遍历(输出)顺序
通俗讲就是两点原则:
1)先从根节点“靠左边”一直往最深的节点遍历;
2)再一层一层的上来把剩余节点以原则
1)
遍历(输出)。
比如这棵二叉树↓(图出处见水印)
根据二叉树深度优先遍历的规则,遍历的顺序就是:1 2 3 4 5 6 7 9 8
2、为了这个顺序,代码实现
用到栈先进后出的特性,代码↓:
void main(Tree* root)
{
Stack<Tree*> nodeStack;
nodeStack.push(root);
while(!nodeStack.empty())
{
root=nodeStack.top();
printf(format, root->data);
nodeStack.pop();
if(root->rChild)
{
nodeStack.push(root->rChild);
}
if(root->lChild)
{
nodeStack.push(root->lChild);
}
}
}
3、代码一步步跑一遍
以这棵二叉树为例↓
初始化代码↓
Stack<Tree*> nodeStack;
nodeStack.push(root);
建立了一个栈,运行完后,栈的内容↓
-------------------
1(栈顶)
-------------------
第1次循环
while(!nodeStack.empty())
{
root=nodeStack.top();
printf(format, root->data);
nodeStack.pop();
if(root->rChild)
{
nodeStack.push(root->rChild);
}
if(root->lChild)
{
nodeStack.push(root->lChild);
}
}
运行后栈的内容,及打印出的内容↓
-------------------
2(栈顶)
6(栈底)
-------------------
打印:1
第2次循环
代码相同,不再粘了。运行后栈的内容,及打印出的内容↓
-------------------
3(栈顶)
5
6(栈底)
-------------------
打印:1 2
第3次循环
运行后栈的内容,及打印出的内容↓
-------------------
4(栈顶)
5
6(栈底)
-------------------
打印:1 2 3
第4次循环
运行后栈的内容,及打印出的内容↓
-------------------
5(栈顶)
6(栈底)
-------------------
打印:1 2 3 4
第5次循环
运行后栈的内容,及打印出的内容↓
-------------------
6(栈顶)
-------------------
打印:1 2 3 4 5
第6次循环
运行后栈的内容,及打印出的内容↓
-------------------
7(栈顶)
-------------------
打印:1 2 3 4 5 6
第7次循环
运行后栈的内容,及打印出的内容↓
-------------------
9(栈顶)
8(栈底)
-------------------
打印:1 2 3 4 5 6 7
第8次循环
运行后栈的内容,及打印出的内容↓
-------------------
空(栈顶)
-------------------
打印:1 2 3 4 5 6 7 9 8
第9次进循环
循环结束,程序结束,最终遍历结果:1 2 3 4 5 6 7 9 8