前言
今天面试,面试官让用Java打印二叉树,前序遍历。答的不是很好,特地记录一下。
使用递归实现。
遍历的三种方式:
前序遍历:(根在前,从左往右,一棵树的根永远在左子树前面,左子树又永远在右子树前面 )
中序遍历:(根在中,从左往右,一棵树的左子树永远在根前面,根永远在右子树前面)
后序遍历:(根在后,从左往右,一棵树的左子树永远在右子树前面,右子树永远在根前面)
二叉树结构图如下:
代码如下:
import lombok.Data;
public class Demo {
public static void main(String[] args) {
//构造二叉树
TreeNode a = new TreeNode(4);
TreeNode b = new TreeNode(2);
TreeNode c = new TreeNode(6);
TreeNode d = new TreeNode(1);
TreeNode e = new TreeNode(3);
TreeNode f = new TreeNode(5);
TreeNode g = new TreeNode(7);
TreeNode h = new TreeNode(8);
TreeNode j = new TreeNode(9);
TreeNode k = new TreeNode(10);
a.setLeftNode(b);
a.setRightNode(c);
b.setLeftNode(d);
b.setRightNode(e);
c.setLeftNode(f);
c.setRightNode(g);
g.setRightNode(h);
g.setRightNode(j);
j.setRightNode(k);
System.out.print("前序遍历: ");
leftTraversal(a);
System.out.print("\n中序遍历: ");
midTraversal(a);
System.out.print("\n后序遍历: ");
rightTraversal(a);
}
/**
* 递归前序遍历
*
* @param node
*/
public static void leftTraversal(TreeNode node) {
if (node == null) {
return;
}
System.out.print(node.getVal() + " ");
leftTraversal(node.getLeftNode());
leftTraversal(node.getRightNode());
}
/**
* 递归中序遍历
*
* @param node
*/
public static void midTraversal(TreeNode node) {
if (node == null) {
return;
}
midTraversal(node.getLeftNode());
System.out.print(node.getVal() + " ");
midTraversal(node.getRightNode());
}
/**
* 递归后续遍历
*
* @param node
*/
public static void rightTraversal(TreeNode node) {
if (node == null) {
return;
}
rightTraversal(node.getLeftNode());
rightTraversal(node.getRightNode());
System.out.print(node.getVal() + " ");
}
}
@Data
class TreeNode {
private int val;
private TreeNode leftNode;
private TreeNode rightNode;
public TreeNode(int val) {
this.val = val;
}
}
输出结果:
前序遍历: 4 2 1 3 6 5 7 9 10
中序遍历: 1 2 3 4 5 6 7 9 10
后序遍历: 1 3 2 5 10 9 7 6 4