二叉樹的遍歷知足遞歸的形式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; } }