二叉树遍历口诀
在了解了递归书写原理和执行原理后,进行实践的规律总结,以下面二叉树遍历为例,相关代码会在文章后面贴出。
二叉树遍历分为:深度遍历和层级遍历
所以,上述二叉树的前序遍历结果为
0,1,3,7,4,2,5,6
即,前序遍历代码输出结果同上
//前序遍历public void deepSortOutFont(TreeNode node){if(node == null){return;}System.out.println("前序遍历为:"+node.val);deepSortOutFont(node.left);deepSortOutFont(node.right);}
所以,上述二叉树的中序遍历的结果为:
3,7,1,4,0,5,2,6
即,中序遍历代码结果同上
//中序遍历public void deepSortOutMiddle(TreeNode node){if(node == null){return;}deepSortOutMiddle(node.left);System.out.println("中序遍历为:"+node.val);deepSortOutMiddle(node.right);}
所以,上述二叉树的后序遍历的结果为:
7,3,4,1,5,6,2,0
即,后序遍历代码结果同上
// 后序遍历public void deepSortOutAfter(TreeNode node){if(node == null){return;}deepSortOutAfter(node.left);deepSortOutAfter(node.right);System.out.println("后序遍历为:"+node.val);}
层序遍历是利用栈的特点,优先遍历节点旁边的节点,依次类推,蔓延下去,具体代码如下:
层序遍历的 过程如下:
所以层序遍历的结果为:
0,1,2,3,4,5,6,7
即上述层序遍历的代码的执行结果同上
//层序遍历public void layerTranverse(TreeNode root){if(root == null){return;}Queue q = new LinkedList();q.add(root);while(!q.isEmpty()){TreeNode n = q.poll();System.out.println(n.val);if(n.left!=null){q.add(n.left);}if(n.right != null){q.add(n.right);}}}
二叉树遍历到递归的应用:
上述我们已经掌握了二叉树深度遍历的口诀及应用,拓展至递归函数中,相对于用递归原理理解有着简单易用,具有很强的实践性。
那么我们应该怎样用这个规律,去理解,解析,并将递归函数转化为普通函数呢?
下面将以归并排序为例,进行讲解:
归并排序的基本代码为:
public static void mergeSort(int array[], int left, int right) {if (left < right) {int middle = (left + right) / 2;// System.out.println("前序遍历:"+Arrays.toString(array));mergeSort(array, left, middle);//System.out.println("中序遍历:"+Arrays.toString(array));mergeSort(array, middle + 1, right);//System.out.println("后序遍历:"+Arrays.toString(array));merge(array, left, middle, right);}}
mearge函数的意思是,将数组的left下标到right下标进行倒序排序,这里为了方便说明就不写出,文章后面会贴出完整代码,下面将一步步进行分析:
array:{ 5, 4, 9, 8, 7, 6, 0, 1, 3, 2 }left:0
right: 9
注意:array的下标是从0开始的
根据函数表述:两个递归函数是将数组的左半部分和右半部分不断分解,直到left>=right(注意终止条件不画出),得到如下二叉树
这样,我们就把递归、递推函数改变成了有着不断入参的非递推函数💴
这样,我们就轻松的对递归函数进行了理解,并且转化为了非递归函数,🦾,相当好用
在上述例子中,我们把merge函数盖住,将
System.out.println("前序遍历:"+Arrays.toString(array));
打开,得到
很明显,这是个前序遍历,根据前面画出的二叉树,根据前序遍历口诀:根左右 ,得到该执行语句的入参