Mybatis源码解析:建议收藏!二叉树各种遍历方式我都帮你总结啦

class Solution {
//声明列表
ArrayList list = new ArrayList<>();
public List postorderTraversal(TreeNode root) {
// 如果根节点为空,则直接返回空列表
if (root == null){
return new ArrayList<>();
}
//判断此节点的左节点是否为空,如果不为空则将递归遍历此节点的左子树
if (root.left != null){
postorderTraversal(root.left);
}
//判断此节点的右节点是否为空,如果不为空则将递归遍历此节点的右子树
if (root.right != null){
postorderTraversal(root.right);
}
//节点不为空,将节点的值添加进列表中
list.add(root.val);
//最后返回列表
return list;
}
}


我们通过观察发现,这代码怎么这么像,是的就是很像,他们唯一的区别就是`list.add(root.val);`代码的位置不一样,这行代码就代表文中的 **遍历(访问)**
下图中为前序遍历(**根**左右)

![](https://upload-images.jianshu.io/upload_images/24195226-86f2674a452f8fe2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


 下图中为中序遍历(左**根**右)

![](https://upload-images.jianshu.io/upload_images/24195226-c2100f0b2760e563.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


下图中为后序遍历(左右**根**)

![](https://upload-images.jianshu.io/upload_images/24195226-a509256842c6f3f8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


## 二叉树非递归遍历

> *   用到栈(FILO 先进后出的特性)
> *   每段代码后,都有栈和其中元素的关系具体过程,建议静下心来慢慢看,有助于理解代码如何运行

*   前序遍历

class Solution {
List list = new ArrayList();
public List preorderTraversal(TreeNode root) {
//如果根节点为空,则直接返回空列表
if(root==null){
return new ArrayList();
}
//声明一个栈
Stack stack = new Stack<>();
//将节点入栈
stack.push(root);
//如果栈不为空
while (!stack.empty()){
//从栈弹出这个节点
TreeNode node = stack.pop();
//添加进列表中
list.add(node.val);
// 如果这个节点的右子节点不为空
if (node.right!=null){
// 将其入栈 因为栈是先进后出,所以先压栈右子节点 后出
stack.push(node.right);
}
// 如果这个节点的左子节点不为空
if (node.left!=null){
// 将其

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值