資料結構Java版之遍曆二叉樹(六)

來源:互聯網
上載者:User

標籤:package   介紹   com   oid   node   左右   資料結構   顯示   img   

  二叉樹是我們在程式中用的最多的一種樹(個人觀點)。最簡單的一個二叉樹是由一個根節點,兩個子節點(一左一右成左右孩子節點)組成。二叉樹是數組和鏈表的結合,即包含了數組的快速尋找優點,又包含了鏈表的快速添加刪除的優點。熟練掌握二叉樹的遍曆方法是很有必要的。下面來介紹一下基於二叉樹的四種遍曆方式。

  下面我們以一個棵簡單的二叉樹為例來說明四種遍曆:

  

建立樹節點類:

    //樹節點    class TreeNode {        public char val;        public TreeNode left;        public TreeNode right;        public TreeNode(char x) {            val = x;        }    }

 

  中序遍曆:

  先遍曆左孩子節點---根節點---右孩子節點

//中序遍曆        左-根-右    (前中後:根的位置)public void InOrder(TreeNode current){    if(current != null) {        InOrder(current.left);        Visit(current);        InOrder(current.right);    }}

  前序走訪:

  遍曆根節點---左孩子節點---右孩子節點

//前序走訪        根-左-右public void PreOrder(TreeNode current){    if(current != null) {        Visit(current);        InOrder(current.left);        InOrder(current.right);    }}

  後序遍曆:

  遍曆左孩子節點---右孩子節點---根節點

    //後續遍曆        左-右-根    public void PostOrder(TreeNode current){        if(current != null) {            InOrder(current.left);            InOrder(current.right);            Visit(current);        }    }

  層序遍曆:

  同一層節點從左往右依次遍曆。

    //層序遍曆        同一層節點從左往右依次遍曆  FIFO    public void LevelOrder(TreeNode current){        List<TreeNode> q = new ArrayList<TreeNode>();        while(current != null) {            Visit(current);            if(current.left != null) {                q.add(current.left);            }            if(current.right != null) {                q.add(current.right);            }            if(q.isEmpty()) return ;            current = q.remove(0);        }    }

以上就是四種基本遍曆方式。下面我們來測試一下,首先寫一個工具函數,用來顯示當前節點的值。

    //*********協助工具輔助****************    public void Visit(TreeNode node) {        System.out.print(node.val);    }

寫Test測試函數:

  

    @Test    public void fun() {        TreeNode root = new TreeNode(‘+‘);        root.left = new TreeNode(‘-‘);        root.right = new TreeNode(‘E‘);        root.left.left = new TreeNode(‘*‘);        root.left.right = new TreeNode(‘D‘);        root.left.left.left = new TreeNode(‘/‘);        root.left.left.right = new TreeNode(‘C‘);        root.left.left.left.left = new TreeNode(‘A‘);        root.left.left.left.right = new TreeNode(‘B‘);                System.out.println("中序遍曆:");        InOrder(root);        System.out.println();        System.out.println("前序走訪:");        PreOrder(root);        System.out.println();        System.out.println("後序遍曆:");        PostOrder(root);        System.out.println();        System.out.println("層序遍曆:");        LevelOrder(root);        System.out.println();    }

由上面的測試函數得到遍曆結果:

 

 

 

 

 

 

全部代碼:

package tree;import java.util.ArrayList;import java.util.List;import org.junit.Test;/** * 二叉數的遍曆 *                     + *                 -         E *             *        D *        /        C *   A        B * @author Ranter * */public class BinaryTree {    @Test    public void fun() {        TreeNode root = new TreeNode(‘+‘);        root.left = new TreeNode(‘-‘);        root.right = new TreeNode(‘E‘);        root.left.left = new TreeNode(‘*‘);        root.left.right = new TreeNode(‘D‘);        root.left.left.left = new TreeNode(‘/‘);        root.left.left.right = new TreeNode(‘C‘);        root.left.left.left.left = new TreeNode(‘A‘);        root.left.left.left.right = new TreeNode(‘B‘);                System.out.println("中序遍曆:");        InOrder(root);        System.out.println();        System.out.println("前序走訪:");        PreOrder(root);        System.out.println();        System.out.println("後序遍曆:");        PostOrder(root);        System.out.println();        System.out.println("層序遍曆:");        LevelOrder(root);        System.out.println();    }        //****************************************************************        //中序遍曆        左-根-右    (前中後:根的位置)    public void InOrder(TreeNode current){        if(current != null) {            InOrder(current.left);            Visit(current);            InOrder(current.right);        }    }    //前序走訪        根-左-右    public void PreOrder(TreeNode current){        if(current != null) {            Visit(current);            InOrder(current.left);            InOrder(current.right);        }    }    //後續遍曆        左-右-根    public void PostOrder(TreeNode current){        if(current != null) {            InOrder(current.left);            InOrder(current.right);            Visit(current);        }    }    //層序遍曆        同一層節點從左往右依次遍曆(使用隊列層序遍曆)    public void LevelOrder(TreeNode current){        List<TreeNode> q = new ArrayList<TreeNode>();        while(current != null) {            Visit(current);            if(current.left != null) {                q.add(current.left);            }            if(current.right != null) {                q.add(current.right);            }            if(q.isEmpty()) return ;            current = q.remove(0);        }    }        //*********協助工具輔助****************    public void Visit(TreeNode node) {        System.out.print(node.val);    }                //樹節點    class TreeNode {        public char val;        public TreeNode left;        public TreeNode right;        public TreeNode(char x) {            val = x;        }    }}

 

資料結構Java版之遍曆二叉樹(六)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.