遍历二叉树的路线是从根节点开始沿左子树深入下去,当深入到最左端,无法再深入下去时,再返回,再逐一进入刚才深入时遇到节点的右子树,再进行如此的深入和返回,知道最后从根节点的右子树返回到根节点位置。
先序遍历是在深入时遇到结点就访问,中序遍历是在从左子树返回时遇到结点就访问,后序遍历是从右子树返回时遇到结点就访问。
//先序遍历
while(栈非空或者p非空){
while(栈非空){
访问;
入栈;
p往所在节点的左子树移动;
}
出栈;
往右;
}
这里先留坑,以后附上java实现的代码。
//中序遍历
while(栈非空或者p非空){
while(栈非空){
入栈;
p往所在节点的左子树移动;
}
出栈;
访问; //即把访问移动到 出栈 和 往右子树移动 之间
往右;
}
这里先留坑,以后附上java实现的代码。
后序与前中不同,后序是每个节点要 入栈两次,当然第二次的入栈不是真的出栈然后入栈操作,只是记录一下就好。
这个记录可以给每个节点加一个计数器来实现,也可将第二次的地址设为负的,通过节点正负来判断是之前访问了几次。
后序遍历,简单来说就是:
第一次入栈,不访问设为1,往左子树走;
左子为空,回来,设为2,往右子树走;
右子为空,回来,发现为2,访问;
while(p){
入栈(第一次)
往左子树移动;
}
出栈 if(第一次){
入栈(第二次)
计时器设为2 或者地址设为负}
else{
访问, p=null }