二叉树的遍历知足递归的形式java
二叉树的遍历知足递归的思路,不管是先序的根左右,中序的左根右,仍是后续的左右跟都是从根结点开始,对每一个结点进行先序/中序/后序的遍历,每一个结点都是如此,假如是先序根左右的遍历,咱们先访问根结点,而后再是左结点,可是左结点没结束,对左结点又进行一遍根左右的遍历,那么对于左结点本身来讲,他本身就是根结点了,而后进行根左右遍历,因而又对总根结点的左结点的左结点再来一次先序遍历…就这样一直把整个二叉树全部结点遍历完数组
该结点没有左右结点怎么办数据结构
以先序举例,假如该结点没有左结点,那就按照根左右的顺序,再访问右结点,要是右结点存在,就继续先序遍历,若是右结点不存在,则这层递归确定是最里层的递归,该层递归到右结点不存在为结束,而后返回上一层递归,并从上层递归中左递归方法调用的下一行开始,也就是从上层递归中的右递归正式开始,换句话说就是从该层递归对应的双亲结点的右结点处继续先序遍历ide
不想将遍历出的数据直接输出控制台怎么办post
我看过严蔚敏版的 C 语言数据结构,其中是把遍历的数据直接输出到控制台中,如今我有个需求就是想把递归遍历的结构保存到数组中,而且递归的返回值就是数组,我该怎么作呢?
因为递归就是在其方法中调用本身,实现这种[<[<[<[
层层嵌套的形式,当第四个[
执行完后,就到第三个[
,最后到第一个[
,第一个最下面返回一个数组便可,实际上每层都会返回数组。this
// 结点 class Node { int data; Node left = null; Node right = null; } // 二叉树 public class BinaryTree { // 根结点 private Node root; // 输入的数组 private int[] arr_in; // 输出的数组 private int[] arr_out; // 记录数组下标 private static int index; // 初始化 public BinaryTree(int[] arr) { root = new Node(); this.arr_in = arr; arr_out = new int[arr.length]; index = 0; } // 先序遍历二叉树(递归)根→左→右 public int[] preorderTraversalRecursion(Node r) { if (r) { arr_out[index++] = r.data; preorderRecursion(r.left, index); preorderRecursion(r.rigth, index); } if (index == arr_in.length) index = 0; return arr_out; } // 中序遍历二叉树(递归)左→根→右 public int[] inorderTraversalRecursion(Node r) { if (r) { inorderRecursion(r.left, index); arr_out[index++] = r.data; inorderRecursion(r.rigth, index); } if (index == arr_in.length) index = 0; return arr_out; } // 后序遍历二叉树(递归)左→右→根 public int[] postorderTraversalRecursion(Node r) { if (r) { postorderRecursion(r.left, index); postorderRecursion(r.rigth, index); arr_out[index++] = r.data; } if (index == arr_out.length) index = 0; return arr_out; } }