二叉树 深度优先遍历 详解

参考自:

http://www.cnblogs.com/lscheng/archive/2013/09/11/3313947.html

http://blog.csdn.net/zhonghua18517/article/details/28238261

1、二叉树深度优先遍历是什么样的遍历(输出)顺序

通俗讲就是两点原则:
1)先从根节点“靠左边”一直往最深的节点遍历;
2)再一层一层的上来把剩余节点以原则 1) 遍历(输出)。

比如这棵二叉树↓(图出处见水印)
二叉树 深度优先遍历 详解_第1张图片
根据二叉树深度优先遍历的规则,遍历的顺序就是:1 2 3 4 5 6 7 9 8

2、为了这个顺序,代码实现

用到栈先进后出的特性,代码↓:
void main(Tree* root)
{
	Stack 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、代码一步步跑一遍

以这棵二叉树为例↓
二叉树 深度优先遍历 详解_第2张图片

初始化代码↓
Stack 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
 
  

你可能感兴趣的:(数据结构)