在java中二叉树的遍历顺序

二叉树的遍历顺序

在这里插入图片描述
在这篇文章中二叉树的递归和非递归创建对二叉树由简单的介绍,在此基础上来仔细分析二叉树的遍历顺序。例子如下图:在这里插入图片描述

先序遍历

在这里插入图片描述

先序遍历的顺序应该是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;
                }
            }

        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牛牛最爱喝兽奶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值