在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···)的剩余的操作)。
有的是繼續進行右邊的遍歷,有的是先打印,這就造成了打印的結果不同。
大一狗初學,有誤請諒解!