二叉树的遍历
二叉树的遍历不同于数组与链表的遍历,二叉树的遍历从节点之间的位置关系角度来看,可以分为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。 按第一层从左到右,第二层从左到右,第三层从左到右的顺序依次遍历。简单吧。
此处需要借助一个数据结构:队列。来进行遍历。
小结:温故而知新,二叉树的遍历今天就学习到这里。赶紧码代码去了。
本文代码链接