在java中實現二叉樹和鏈表的方法都是在類中定義該類的對象引用
比如
class Tree { int data; Tree left; Tree right; }
這樣的話當我們new一個Tree對象的時候,該對象就擁有了left和right兩個對象,這樣就起到了連接的
作用,在鏈表中就是連接了下一個,在樹中就相當於邊,這樣就起到一個接一個的效果。總之,就是吧對象連接起來了。
下面是完整代碼
package code; public class TwoTree { public static void main(String[] args) { Tree root=new Tree(50); int array[]={25,89,48,90,101,13,45,60}; for(int n=0;n<8;n++) { root.insert(root, array[n]); } Bianli bl=new Bianli(root); bl.second(root); } } class Tree { int data; Tree left; Tree right; //每一棵樹 public Tree(int data) { this.data=data; left=null; right=null; } public void insert(Tree root,int data) { //如果比根大,如果右邊為空,就放到根的右邊,否則,則以此時根的右邊為另一棵樹的根,放到他的右邊 //依次下去 if(data>root.data) { if(root.right==null) { root.right=new Tree(data); } else { this.insert(root.right, data); } } //左邊同理 else { if(root.left==null) root.left=new Tree(data); else this.insert(root.left, data); } } } class Bianli { Tree root; public Bianli(Tree root) { this.root=root; } //第一種遍歷方法,前序遍歷,根--左子樹--右子樹 public void first(Tree root) { if(root!=null) { System.out.println(root.data); first(root.left); first(root.right); } } //第二種遍歷方法。中序遍歷 A字形遍歷, 右邊的從上到下,左邊的從下到上 public void second(Tree root) { if(root!=null) { second(root.left); System.out.println(root.data); second(root.right); } }
//第三種後序遍歷
public void third(Tree root) { if(root!=null) { third(root.left); third(root.right); System.out.println(root.data); } } }
在代碼中我們可以發現用了很多的遞歸,先拿生成樹的遞歸說。
public void insert(Tree root,int data) { //如果比根大,如果右邊為空,就放到根的右邊,否則,則以此時根的右邊為另一棵樹的根,放到他的右邊 //以此下去 if(data>root.data) { if(root.right==null) { root.right=new Tree(data); } else { this.insert(root.right, data); } } //左邊同理 else { if(root.left==null) root.left=new Tree(data); else this.insert(root.left, data); } }
這裡的遞歸是這樣實現的,當我們根的有右邊為空的話,那麼就將添加的對象添加至右邊
否則的話,就遞歸,即將根的右邊的對象作為子樹的一個根,依次這樣下去。
我們可以這樣理解,將大的一棵樹看成是多課/\這樣的一棵樹(二叉樹)。
----------------------------------------
二叉樹的遍歷,在代碼中的三種遍歷,我們發現都代碼差不多,只不過輸出的語句位置不同。這個需要
我們自己去體會,下面簡單講一下。
我們需要回到遞歸的本質
int num=0; public void DG(int n) { if(n==1) return 1; num=n*DG(n-1); }
這是n的階乘,最經典的遞歸的例子。
我們分析可以知道,遞歸就是一個方法調用自己,
比如上面代碼中的DG 方法裡面調用DG方法
我們需要一個條件是結束遞歸,然後再從後往前面計算,最後回到遞歸開始的地方。
同樣上面二叉樹的遍歷也是一樣,三種遍歷的代碼很像。
當我們滿足結束的標志的時候,需要完成最後一次second(或者first 或者third)方法
(抽象理解 12345678這裡我把遞歸形象化,完成1的操作需要完成2,完成2需要3···以此類推。那麼倒回來,到8的時候結束遞歸,這時候需要完成8的所有操作,然後到7完成所有操作依次類推,最後回到開始遞歸的地方)
而三種遍歷方法不同的就是,就是執行完該方法後的操做(即8(76···)的剩余的操作)。
有的是繼續進行右邊的遍歷,有的是先打印,這就造成了打印的結果不同。
大一狗初學,有誤請諒解!