本文是看牛客网二叉树视频的个人笔记
先序遍历:中、左、右 。先遍历头结点,然后遍历左子树,最后遍历右子树
中序遍历:左、中、右。
后续遍历:左、右、中。
其他遍历如中、右、左;右中左;右左中也有,但是不常见。如下所示.图片截取自牛客网:
以上大致先解了先序遍历和中序遍历以及后续遍历,现在就看一下具体实现方式。一般分为两种实现方式,递归和非递归:
先看 先序遍历:递归的方式,递归比较简单*(中左右)
public void preOrderRecur(Node head){
if (head == null){
return;}
System.out.print(head.value + " ");
preOrderRecur(head.left);
preOrderRecur(head.right);
}
另外一种是非递归的方式实现先序遍历,通过栈的形式:
1.首先申请一个新的栈,纪委stack;
2.然后将头结点head压入stack中;
3.每次从stack中弹出的栈顶节点,记为cur,然后打印cur节点的值,如果cur右孩子不为空的话,将cur的右孩子先压入到stack中,最后如果cur的左孩子不为空的话,将cur的左孩子压入到stack中。如下图所示:(来自牛客网视屏)
4.不断重复3,知道stack为空,结束
再看一下中序遍历(左中右)
先看递归方法
public void preOrderRecur(Node head){
if (head == null){
return;}
preOrderRecur(head.left);
System.out.print(head.value + " ");
preOrderRecur(head.right);
}
再看非递归方法:
1.申请一个栈,记为stack,申请一个变量cur,初始值令cur等于头结点;
2.先把cur节点压入栈中,对以cur节点为头的整颗子树来说,依次把整棵树的左边界压入栈中,也就是说不断令cur=cur.left,然后重复步骤2;
3.不断重复步骤2,知道发现cur为空,此时从stack中弹出一个节点,记为node,打印node的值,并让cur=node.right,然后继续重复步骤2;
4.将stack为空,并且cur为空时,整个过程结束。下图所示:截图不是很连贯,大体还是能表达出一些意思