二叉树之前序、中序、后序遍历
下面遍历以下面这课二叉树为例
对应每个节点的代码(Java)如下:
Class BinaryTree{
private int val;
private BinaryTree left;
private BinaryTree right;
}
前序遍历
思想
前序遍历,也就是先遍历根结点,再遍历左右结点。
那么对应遍历顺序应为 1->4->3->2->5
遍历代码
//前序遍历
public static void preScan(TreeNode root){
System.out.println(root.val);
if(root.left != null){
preScan(root.left);
}
if(root.right != null){
preScan(root.right);
}
}
代码解释: 将根结点传入方法,首先打印根结点的值,再向左遍历左子树,再向右遍历右子树。
直到当前结点的左右结点都为空,结束遍历。
中序遍历
思想
中序遍历,也就是先遍历左结点,再遍历中间节点,最后遍历右结点。
那么对应遍历顺序应为 3->4->1->5->2
遍历代码
//中序遍历
public static void midScan(TreeNode root){
if(root.left != null){
midScan(root.left);
}
System.out.println(root.val);
if(root.right != null){
midScan(root.right);
}
}
代码解释: 将根结点传入方法,首先向左遍历左子树,再打印根结点的值,再向右遍历右子树。
直到当前结点的左右结点都为空,结束遍历。
后序遍历
思想
后序遍历,先遍历左结点,再遍历右结点,最后遍历中间节点。
那么对应遍历顺序应为 3->4->5->2->1
遍历代码
//后序遍历
public static void lastScan(TreeNode root){
if(root.left != null){
lastScan(root.left);
}
if(root.right != null){
lastScan(root.right);
}
System.out.println(root.val);
}
代码解释: 将根结点传入方法,首先向左遍历左子树,再向右遍历右子树,再打印根结点的值。
直到当前结点的左右结点都为空,结束遍历。
LeetCode简单题
思路:
审题发现,给的这棵二叉树为搜索树,也就是左子结点都小于父结点,右子结点都大于父节点。
发现中序遍历这棵二叉树,得到的值是从小到大的顺序排列的。
那么这就好办了,我们可以创建一个List, 将中序遍历的结果的值放入list中,结果是有序的,那么我们就可以根据下标获取其第几大的节点了。
代码如下:
public static int kthLargest(TreeNode root, int k) {
ArrayList<Integer> list = new ArrayList<>();
if(root != null){
midGet(root, list);
}
//因为列表是升序的,这里用list的长度减去k,就刚好是第k大的数。如果不能理解,你可以把list先反转一下,就是倒序了,那么第k大的就是k-1(因为list下标从0开始嘛)。
return list.get(list.size() - k);
}
public static void midGet(TreeNode t, List<Integer> list){
if(t.left != null){
midGet(t.left, list);
}
list.add(t.val);
if(t.right != null){
midGet(t.right, list);
}
}
总结
- 二叉树的前中后遍历其实挺简单的,只要记住,前中后修饰的都是根节点,也就是说前序遍历,就是先遍历根,中序就是中间遍历根,后序就是最后遍历根。另外左右是先遍历左边。
- 通过一道实际的算法题,相信小伙伴对二叉树的遍历掌握更牢固了,又进步了一点点。