程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> java生成二叉樹和遍歷,java生成二叉樹

java生成二叉樹和遍歷,java生成二叉樹

編輯:JAVA綜合教程

java生成二叉樹和遍歷,java生成二叉樹


在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···)的剩余的操作)。

有的是繼續進行右邊的遍歷,有的是先打印,這就造成了打印的結果不同。

大一狗初學,有誤請諒解!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved