二叉树学习(三):二叉树遍历

1、二叉树遍历原理

二叉树的遍历是指从根结点出发,按照某种次序依次访问树中所有结点,使得每个结点被访问依次且仅被访问一次。
其中访问代表对该结点的数据的操作,这里我们可以认为就是直接打印该结点的数据。
二叉树遍历算法的基础是递归

2、前序遍历DLR

若二叉树为空,则空操作返回。否则先访问根结点,然后前序遍历左子树,再前序遍历右子树。
先访问,再左子树,再右子树。
前序遍历

前序遍历算法

public void preOrder(Node<T> node){
    if(node==null){
        return;
    } else {
        system.out.println(node.data);
        preOrder(node.lChild);
        preOrder(node.rChild);
    }
}

遍历结果是:A B D G H C E I F
算法解析:
1、首先判断是否为空树,不为空(根节点不为空),则执行system.out.println(node.data);打印出A。
2、接下来在A结点上递归调用执行preOrder(node.lChild);访问根节点A的左孩子B,不为null,则system.out.println(node.data)打印显示字母B
3、在B结点上递归调用preOrder(node.lChild);访问结点D,D结点不为空,打印显示D
4、在D结点上递归调用preOrder(node.lChild);访问结点H,H不为空,输出打印H
4、在H结点上递归调用preOrder(node.lChild);H左子树为空,H结点上的preOrder(node.lChild);这行代码返回
5、执行H结点上的preOrder(node.rChild);,访问H结点的右结点K,K不为空,输出打印K
6、在K上递归调用preOrder(node.lChild);为空返归,
7、在K上递归调用preOrder(node.rChild);为空返回到H结点,
8、H结点的preOrder(node.rChild);这行代码返回了,则H结点的代码执行完毕,返回到D结点
9、D结点的preOrder(node.lChild);代码返回了,调用preOrder(node.rChild)遍历D结点的右子树,右子树为空,返回;
10、返回到B结点,B结点调用preOrder(node.rChild);访问B结点的右子树E,E不为空,输出打印E
11、在E结点上递归调用preOrder(node.lChild);preOrder(node.rChild);均为空,返回到B,
12、B结点代码执行完毕,返回到A结点,
13、A结点执行preOrder(node.rChild);访问A结点的右子树C,C不为空,输出打印C
14、在C结点递归调用preOrder(node.lChild);访问C的左子树F,F不为空输出打印F
15、在F上递归调用preOrder(node.lChild);访问F的左子树I,I不为空,输出打印I
16、在I结点上调用preOrder(node.lChild);preOrder(node.rChild);均为空,返回到结点F
17、结点F调用preOrder(node.rChild);访问F结点右子树,右子树为空,返回
18、F结点代码执行完毕,返回到C结点,C结点调用preOrder(node.rChild);访问C结点的右子树G,G不为空,输出打印G
19、在G结点上递归调用preOrder(node.lChild);访问G的左子树,左子树为空,返回
20、G结点调用preOrder(node.rChild);访问G结点的右子树J,J不为空,输出打印J
21、在J上调用preOrder(node.lChild);preOrder(node.rChild);均为空,返回
22、G代码执行完毕返回到C,
23、C代码执行完毕返回到A,
24、A代码执行完毕,整个遍历结束。
最终输出结果:
A B D G H C E I F

3、 中序遍历LDR

先左子树,再访问,再右子树。

中序遍历

public void preOrder(Node<T> node){
    if(node==null){
        return;
    } else {
        preOrder(node.lChild); //左子树
        system.out.println(node.data); //输出打印
        preOrder(node.rChild);  //右子树
    }
}

遍历算法跟前序遍历相似,其关键就是递归调用,在哪个结点上递归,返回到哪个结点。
遍历输出结果是:G D H B A E I C F

4、后序遍历LRD

先右子树,再左子树,再访问

后序遍历

public void preOrder(Node<T> node){
    if(node==null){
        return;
    } else {
        system.out.println(node.data); //输出打印
        preOrder(node.lChild); //左子树
        preOrder(node.rChild);  //右子树
    }
}

遍历算法同前序、中序。
遍历输出结果是: G H D B I E F C A

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值