Java實現運算式二叉樹_java

來源:互聯網
上載者:User

什麼是二叉樹,這裡不再介紹,可以自行百度:二叉樹。在這裡利用java實現“運算式二叉樹”。 

運算式二叉樹的定義 

第一步先要搞懂運算式二叉樹是個什麼東東?舉個栗子,運算式:(a+b×(c-d))-e/f。將數字放在葉子節點,將操作符放在分支節點,就構成了一個二叉樹,由於儲存的是一個運算式,稱之為“運算式二叉樹”。

童靴們可能好奇這個到底是怎麼構建的?就拿45+23*56/2-5來說吧。首先取出第一個數字45放在葉子節點,遇到“+”後將其放到分支節點,

然後將“23”、“*”、“56”、“/”、“2”依次放入,

最後放入“-”、“5”,

大致就是這樣。(這些圖我自己畫的,比較醜,大家看看就好(⊙﹏⊙))

運算式二叉樹的構建步驟
1.建立節點對象; 
2.辨析出操作符與資料,存放在相應的列表(隊列)中; 
3.取出前兩個數字和一個操作符,組成一個新的數位元組點; 
4.重複第3步,直到操作符取完為止; 
5.讓根節點等於最後一個節點。  

 運算式二叉樹的實現
 首先構建節點對象類,包括資料,左子樹,右子樹和幾個set、get方法。 

package tets0714;/** * 結點對象類 * @author yuxiu * */public class Node {  // 資料  private String data;  // 左子樹  private Node lchild;  // 右子樹  private Node rchild;  Node() {  }  Node(String data) {    this.data = data;  }  Node(String data, Node lchild, Node rchild) {    super();    this.data = data;    this.lchild = lchild;    this.rchild = rchild;  }  public String getData() {    return data;  }  public Node getLchild() {    return lchild;  }  public Node getRchild() {    return rchild;  }}

接著就是構建運算式二叉樹了。 

package tets0714;import java.util.ArrayList;/** * 運算式二叉樹類 * @author yuxiu * */public class Formaluetree {  private String s="";  private Node root;   //根節點  /**   * 建立運算式二叉樹   * @param str  運算式   */  public void creatTree(String str){    //聲明一個數組列表,存放的操作符,加減乘除    ArrayList<String> operList = new ArrayList<String>();    //聲明一個數組列表,存放節點的資料    ArrayList<Node> numList = new ArrayList<Node>();    //第一,辨析出操作符與資料,存放在相應的列表中    for(int i=0;i<str.length();i++){      char ch = str.charAt(i);     //取出字串的各個字元      if(ch>='0'&&ch<='9'){        s+=ch;      }else{        numList.add(new Node(s));        s="";        operList.add(ch+"");              }          }    //把最後的數字加入到數位元組點中    numList.add(new Node(s));        while(operList.size()>0){  //第三步,重複第二步,直到操作符取完為止      //第二,取出前兩個數字和一個操作符,組成一個新的數位元組點      Node left = numList.remove(0);      Node right = numList.remove(0);      String oper = operList.remove(0);            Node node = new Node(oper,left,right);      numList.add(0,node);    //將新生的節點作為第一個節點,同時以前index=0的節點變為index=1          }    //第四步,讓根節點等於最後一個節點    root = numList.get(0);              }  /**   * 輸出結點資料   */  public void output(){      output(root);   //從根節點開始遍曆  }  /**   * 輸出結點資料   * @param node   */  public void output(Node node){    if(node.getLchild()!=null){    //如果是葉子節點就會終止      output(node.getLchild());    }    System.out.print(node.getData());   //遍曆包括先序遍曆(根左右)、中序遍曆(左根右)、後序遍曆(左右根)    if(node.getRchild()!=null){      output(node.getRchild());    }      }    public static void main(String[] args) {    Formaluetree tree = new Formaluetree();    tree.creatTree("45+23*56/2-5");//建立運算式的二叉樹    tree.output();//輸出驗證  }}

最後在控制台可以輸出“45+23*56/2-5”,OK了。這裡使用的中序遍曆,小夥伴們可以試試採用先序遍曆、後序遍曆是什麼效果。至於遍曆,我們後面再講。

以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援雲棲社區。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.