二叉树的先序遍历和中序遍历

本文是看牛客网二叉树视频的个人笔记

先序遍历:中、左、右 。先遍历头结点,然后遍历左子树,最后遍历右子树

中序遍历:左、中、右。

后续遍历:左、右、中。

其他遍历如中、右、左;右中左;右左中也有,但是不常见。如下所示.图片截取自牛客网:


以上大致先解了先序遍历和中序遍历以及后续遍历,现在就看一下具体实现方式。一般分为两种实现方式,递归和非递归:

先看 先序遍历:递归的方式,递归比较简单*(中左右)

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为空时,整个过程结束。下图所示:截图不是很连贯,大体还是能表达出一些意思


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值