二叉树的遍历顺序
在这篇文章中二叉树的递归和非递归创建对二叉树由简单的介绍,在此基础上来仔细分析二叉树的遍历顺序。例子如下图:
先序遍历
先序遍历的顺序应该是7,2,1,4,3,5,8,中、左、右的遍历方式。采用递归的遍历方式相对于非递归的遍历更容易理解一点,先序的递归思路是先访问的根节点,所以首先访问的是根节点7,紧接着到了2号结点也是7号结点的左节点,在去访问2号结点的左节点在右节点,先序主要遍历方式就是根节点 左节点 右节点的方式。
1.先序的递归遍历
public void perorder(Node root) {//先序遍历
if(root!=null) {
System.out.println(root.date);
perorder(root.leftNode);
perorder(root.rightNode);
}
}
2.先序的非递归遍历
public void preOrder(Node root) {//前序非递归
Stack<Node> stack = new Stack<Node>();
Node node = root;
while(node!=null||stack!=null) {
if(node!=null) {
stack.push(node);
System.out.println(node.date);
node=node.leftNode;
}else if(stack!=null){
node=stack.pop();
node=node.rightNode;
}
}
}
中序遍历
中序遍历的顺序应该是1,2,3,4,5,7,8,左、中、右的遍历方式。中序的非递归遍历方式思路首先找到非递归的起点,二叉树的最左子树,如上图中的1号结点,在遍历的过程中需要用栈来存取左节点不为空的结点 方便遍历。
1.递归中序遍历
public void inorder(Node root) {//中序遍历
if(root!=null) {
inorder(root.leftNode);
System.out.print(root.date+" ");
inorder(root.rightNode);
}
}
2.非递归中序遍历
public Node Gofarleft(Node n,Stack<Node> stack) {//用来查找最左子结点
if(n==null) {
return null;
}
while(n.leftNode!=null) {//如果左节点不为空,进入循环体
stack.push(n);//将左节点不为空的结点入栈,先进后出,刚好满足 遍历顺序
n=n.leftNode;//下一个左节点
}
return n;
}
public void inorderF(Node root) {//非递归中序遍历
Stack<Node> stack = new Stack<Node>(); //初始化栈空间
Node node = Gofarleft(root, stack);//判断二叉树的最左子树的左节点并返回
while(node!=null) {//如果该节点不为空
System.out.println(node.date);//答应该节点数据
if(node.rightNode!=null) {//如果该节点存在右节点
node=Gofarleft(node.rightNode, stack);//继续遍历寻找最左子树
}else if(!stack.empty()) {//如果栈不为空时,将栈顶元素弹出,此时的结点没有左右子节点
node = stack.pop();
}else {//否则该节点为空,退出循环体
node=null;
}
}
}
后序遍历
后序遍历的顺序应该是1,3,5,4,2,8,7,左、右、中的遍历方式。
1.后序递归遍历
public void afterorder(Node root) {//后序遍历
if(root!=null) {
afterorder(root.leftNode);
afterorder(root.rightNode);
System.out.println(root.date);
}
}
2.后序非递归遍历
private void postOrderNR() {
Stack<Node> stack = new Stack<>();
Node node = root;
Node pre = null;
while(!stack.isEmpty()||node!=null){
while (node!=null){
stack.push(node);
node = node.left;
}
if (!stack.isEmpty()){
node = stack.pop();
if(node.right==null||pre==node.right){
System.out.print(node.e+" ");
pre = node;
node =null;
}else{
stack.push(node);
node = node.right;
}
}
}
}