二叉树 深度优先遍历 详解

参考自:

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
 
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值