二叉树 深度优先遍历 详解

来源:互联网 发布:守望先锋max录入数据 编辑:程序博客网 时间:2024/06/08 14:53

参考自:

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
2 1
原创粉丝点击