三种递归方式遍历二叉树

1. 对于树的遍历有前序遍历、中序遍历、后续遍历和层次遍历,在前三种的遍历方式中我们常用的是使用递归方式来进行遍历

2. ① 前序遍历:按照先遍历根节点,再遍历左孩子,最后遍历右孩子的顺序所以我们在递归的方法的一开始就可以对元素进行输出这样输出来的顺序就是前序遍历二叉树的顺序

② 中序遍历:按照先遍历左孩子,再遍历根节点,最后遍历右孩子的顺序所以我们在递归左孩子结束的时候对元素进行输出这样输出来的顺序就是中序遍历二叉树的顺序

③ 后序遍历:按照先遍历左孩子,再遍历右孩子,最后遍历根节点的顺序所以我们在递归左孩子和右孩子都递归完了之后可以对元素进行输出这样输出来的顺序就是后序遍历二叉树的顺序

这三种遍历方式采用的都是递归的方式所以我们在想的时候需要根据遍历二叉树的特点来将输出语句写在什么地方,比如像后序遍历,先访问左孩子,然后再访问右孩子,所以等到前面两个都递归完毕那么这个时候当前的节点就是根节点那么就可以对其进行输出即可这样就可以达到后序遍历二叉树的要求,对于其余的遍历也是类似的

这其实也是递归中一条路走到黑的特点的体现关键是在递归完的某个地方将相应的输出代码写上那么就可以了

理解这三种使用递归方式对于二叉树的遍历的话对于理解递归也是很有帮助的,可以促进我们理解在递归调用某一部分的时候我们应该采取什么样的操作

3. 具体的代码如下:

/*
 *           3
 *       9       20
 *     1  6    15   7
 *    45  67  4 
 * */
public class Main {
	public static void main(String[] args) {
		TreeNode<Integer> root = new TreeNode<Integer>(3);
		TreeNode<Integer> l = new TreeNode<Integer>(9);
		TreeNode<Integer> r = new TreeNode<Integer>(20);
		TreeNode<Integer> ll = new TreeNode<Integer>(1);
		TreeNode<Integer> lr = new TreeNode<Integer>(6);
		TreeNode<Integer> rl = new TreeNode<Integer>(15);
		TreeNode<Integer> rr = new TreeNode<Integer>(7);
		TreeNode<Integer> lll = new TreeNode<Integer>(45);
		TreeNode<Integer> llr = new TreeNode<Integer>(67);
		TreeNode<Integer> rll = new TreeNode<Integer>(4);
		root.left = l;
		root.right = r;
		l.left = ll;
		l.right = lr;
		r.left = rl;
		r.right = rr;
		rl.left = rll;
		ll.left = lll;
		ll.right = llr;	
		System.out.print("前序遍历的顺序是:  ");
		preOrder(root);
		System.out.println();
		System.out.print("中序遍历的顺序是:  ");
		inOrder(root);
		System.out.println();
		System.out.print("后序遍历的顺序是:  ");
		lastOrder(root);
	}
	
	private static void lastOrder(TreeNode<Integer> node) {
		if(node == null) return;
		lastOrder(node.left);
		lastOrder(node.right);
		System.out.print(node.value + " ");
	}

	private static void inOrder(TreeNode<Integer> node) {
		if(node == null) return;
		inOrder(node.left);
		System.out.print(node.value + " ");
		inOrder(node.right);
	}

	private static void preOrder(TreeNode<Integer> node) {
		if(node == null) return;
		System.out.print(node.value + " ");
		preOrder(node.left);
		preOrder(node.right);
	}

	public static class TreeNode<T>{
		TreeNode<T> left;
		TreeNode<T> right;
		T value;
		public TreeNode(T value) {
			super();
			this.value = value;
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值