目录

  • 一、结构
  • 二、遍历二叉树
  • 1.前序遍历(递归)
  • 代码
  • 图解
  • 2.前序遍历(非递归)
  • 代码
  • 图解


一、结构

二叉树遍历java非递归 java二叉树前序遍历非递归_前序遍历

二、遍历二叉树

这块内容是二叉树最核心的部分。不但要掌握七种遍历的写法,前、中、后序的递归、非递归写法+层次遍历,还有学会(1)用前、中、后序遍历数组创建二叉树;(2)用一维数组存储二叉树。

1.前序遍历(递归)

前序遍历访问节点的顺序是 根节点-左儿子-右儿子。

代码

public void preOrderRecur(Node root) {
		if (root == null) {
			return;
		}
		System.out.print(root.data + " -> ");
		preOrderRecur(root.left);
		preOrderRecur(root.right);
	}

图解

初始。

二叉树遍历java非递归 java二叉树前序遍历非递归_前序遍历_02


第一步:

(1)执行preOrderRecur(Node root)方法,访问节点A,打印“A”。

二叉树遍历java非递归 java二叉树前序遍历非递归_前序遍历_03


第二步:

(1)执行preOrderRecur(root.left)方法,访问节点B,不为空,打印“B”。

二叉树遍历java非递归 java二叉树前序遍历非递归_前序遍历_04


第三步:

(1)递归调用preOrderRecur(B.left)方法,访问节点D,不为空,打印“D”。

二叉树遍历java非递归 java二叉树前序遍历非递归_二叉树遍历java非递归_05


第四步:

(1)递归调用preOrderRecur(D.left)方法,D.left为空,返回;

(2)递归调用preOrderRecur(D.right)方法,访问节点H,打印“H”。

二叉树遍历java非递归 java二叉树前序遍历非递归_二叉树_06


第五步:

(1)递归调用preOrderRecur(H.left)方法,此时H.left为空,返回;

(2)递归调用preOrderRecur(H.right)方法,此时H.right为空,返回;

(3)返回到上一级递归方法,即到打印“D”的方法中,这个方法也执行完毕,继续返回到打印“B”的方法中;

(4)递归调用preOrderRecur(B.right)方法,访问节点E,打印“E”。

二叉树遍历java非递归 java二叉树前序遍历非递归_Java_07


第六步:

(1)递归调用preOrderRecur(E.right)方法,访问节点I,打印“I”。

二叉树遍历java非递归 java二叉树前序遍历非递归_二叉树_08


第七步:

(1)递归调用preOrderRecur(I.left)方法,此时I.left为空,返回;

(2)递归调用preOrderRecur(I.right)方法,此时I.right为空,返回;

(3)返回上一级递归方法,即打印“E”的方法中,递归调用preOrderRecur(E.right)方法,访问节点J,打印“J”。

二叉树遍历java非递归 java二叉树前序遍历非递归_二叉树遍历java非递归_09


第八步:

(1)J的左右子树都为空,返回到打印“E”的方法中,该方法执行完毕;

(2)返回到打印“B”的方法中,该方法也执行完毕,接着向上返回到打印“A”的方法中;

(3)递归调用preOrderRecur(A.right)方法,访问节点C,打印“C”。

二叉树遍历java非递归 java二叉树前序遍历非递归_二叉树_10


第九步:

二叉树遍历java非递归 java二叉树前序遍历非递归_Java_11


第十步:

二叉树遍历java非递归 java二叉树前序遍历非递归_Java_12


打印顺序为:ABDHEIJCFG

2.前序遍历(非递归)

代码

public void preOrder() {
		if (root == null)
			return;
		Node current;
		//把LinkedList当栈使用
		LinkedList<Node> s = new LinkedList<Node>();
		s.addFirst(root);
		while (!s.isEmpty()) {
			current = s.removeFirst();
			System.out.print(current.data + " -> ");
			if (current.right != null)
				s.addFirst(current.right);
			if (current.left != null)
				s.addFirst(current.left);
		}

	}

图解

初始:

二叉树遍历java非递归 java二叉树前序遍历非递归_前序遍历_02


第一步:

(1)s.addFirst(root);

二叉树遍历java非递归 java二叉树前序遍历非递归_二叉树遍历java非递归_14

第二步:

(1)取出A,打印“A”;

(2)A的左右孩子都不为空,先放入右孩子C,在放入左孩子B。

二叉树遍历java非递归 java二叉树前序遍历非递归_二叉树_15

第三步:

(1)取出B,打印“B”;

(2)B的左右孩子都不为空,先放入B的右孩子E,再放入一左孩子D。

二叉树遍历java非递归 java二叉树前序遍历非递归_数据结构_16

第四步:

(1)取出D,打印“D”;

(2)D的左孩子为空,不放入,D的右孩子为H放入。

二叉树遍历java非递归 java二叉树前序遍历非递归_前序遍历_17

第五步:

(1)取出H,打印“H”;

(2)H的左、右孩子都为空,都不放入;

二叉树遍历java非递归 java二叉树前序遍历非递归_二叉树_18

第六步:

(1)取出E,打印“E”;

(2)E的左、右孩子都不为空,先放入E的右孩子J,在放入E的左孩子I。

二叉树遍历java非递归 java二叉树前序遍历非递归_Java_19

第七步:
(1)因为I、J没有左、右子孩子,所以都只取出,不放入。

二叉树遍历java非递归 java二叉树前序遍历非递归_数据结构_20

第八步:

(1)取出C,打印“C”;

(2)放入C的右孩子G和左孩子F。

二叉树遍历java非递归 java二叉树前序遍历非递归_二叉树_21

第九步:

(1)因为F、G没有左、右子孩子,所以都只取出,不放入。

二叉树遍历java非递归 java二叉树前序遍历非递归_数据结构_22


打印顺序为:ABDHEIJCFG