算法学习笔记(三)

二叉树的遍历

二叉树的遍历不同于数组与链表的遍历,二叉树的遍历从节点之间的位置关系角度来看,可以分为4种遍历。

1.前序遍历。
2.中序遍历。
3.后序遍历。
4.层序遍历。

从更宏观的角度来看,又可以归结为两大类。
1.深度优先遍历(前序遍历,中序遍历,后序遍历)
2.广度优先遍历(层序遍历)。

1.1深度优先遍历:

1.前序遍历。

前序遍历的输出顺序为根节点----左子树----右子树。即从根节点开始,将左边的节点树依次遍历完成之后,再遍历右边的树。遵循全部先左后右的原则,包括子树

在这里插入图片描述

如上图所示,前序遍历的顺序为 1,2,4,8,9,5,10,11,3,6,7。先左后右!

2.中序遍历

二叉树的中序遍历,输出顺序是左子树,根节点,右子树。
在这里插入图片描述

如上图所示,则输出顺序是8,4,9,2,10,5,11,1,6,3,7.先是最后一个左孩子,再是该左孩子的根节点,再是右孩子,然后再根节点,再右子树的左孩子,再是左孩子的根节点,然后是该根节点的右节点。

3.后序遍历

二叉树的后序遍历,输出顺序是左子树,右子树,根节点。

在这里插入图片描述

如上图所示的顺序为,8,9,4,10,11,5,2,6,7,3,1.,先是左子树的最后一层节点,若该左子树的根节点还有右子树,则该根节点应该在右子树的底层节点之后,所以图中,2节点应该在5节点之后,再然后才是右子树的最底层 6,7,3,最后才是根节点1.

/**
*构建二叉树
*@paraminputList
*@return
*/
publicstaticTreeNodeCreateBinaryTree(LinkedListinputList){
TreeNodenode=null;

if(inputList==null||inputList.isEmpty()){
returnnull;
}

Integerdata=inputList.removeFirst();//若此处为空,则不再进一步递归

if(data!=null){
node=newTreeNode(data);
node.leftChild=createBinaryTree(inputList);
node.rightChild=createBinaryTree(inputList);
}

returnnode;
}

此处省略二叉树的前序遍历,中序遍历,后序遍历代码。手动实践更好,不贴代码了。仅仅输出的执行位置不同。。
前序遍历的输出位置在前面,中序遍历的输出位置在中间,后序遍历的输出位置在最后。这里是把一个线性的链表转化成非线性二叉树,链表节点的顺序恰恰是二叉树前序遍历的顺序。链表中的空值,代表二叉树节点的左孩子或者右孩子为空的情况。

注:此处也可以用另一种数据结构来解决:栈,因为递归和栈都可以回退!

1.2 广度优先遍历

1,层序遍历:通俗来讲就是将树的一层一层的按顺序遍历。
在这里插入图片描述

如上图所示顺序为,1,23,4567,891011。 按第一层从左到右,第二层从左到右,第三层从左到右的顺序依次遍历。简单吧。

此处需要借助一个数据结构:队列。来进行遍历。

小结:温故而知新,二叉树的遍历今天就学习到这里。赶紧码代码去了。
本文代码链接

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值