程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 二叉樹的遞歸遍歷和非遞歸遍歷(附詳細例子)

二叉樹的遞歸遍歷和非遞歸遍歷(附詳細例子)

編輯:C++入門知識

二叉樹的遞歸遍歷和非遞歸遍歷(附詳細例子)

二叉樹的遍歷主要有遞歸實現和非遞歸實現,遞歸實現比較好理解,非遞歸實現主要是利用了棧的思想,後進先出,本文實現二叉樹的非遞歸遍歷主要是用了LinkedList可以當做棧使用的功能。具體例子如下:

package com.sheepmu; 

import java.util.LinkedList;
 
public class BinaryTree
{
    private TreeNode root;// 根節點

    public BinaryTree()
    {
    }
    public BinaryTree(TreeNode root)
    {
        this.root = root;
    }
    public TreeNode getRoot()
    {
        return root;
    }
    public void setRoot(TreeNode root)
    {
        this.root = root;
    }

    /**
     * 節點類
     */
    private static class TreeNode
    {
        private String data = null;// 數據部分
        private TreeNode left;// 左節點的引用
        private TreeNode right;// 右節點的引用
        public TreeNode(String data, TreeNode left, TreeNode right)//節點的構造函數,測試函數中創建節點就是用了它
        {
            this.data = data;
            this.left = left;
            this.right = right;
        }     
        public String getData()//節點類的get和set方法
        {
            return data;
        }
        public void setData(String data)
        {
            this.data = data;
        }
        public TreeNode getLeft()
        {
            return left;
        }
        public void setLeft(TreeNode left)
        {
            this.left = left;
        }
        public TreeNode getRight()
        {
            return right;
        }
        public void setRight(TreeNode right)
        {
            this.right = right;
        }
    }
 
    /**
     *  遞歸 前續遍歷
     */
    public void preOrder(TreeNode node)
    {
        if (node != null)
        {
            System.out.print(node.getData()+"  ");
            preOrder(node.getLeft());
            preOrder(node.getRight());
        }
    }

    /**
     *  遞歸 中續遍歷
     */
    public void inOrder(TreeNode node)
    {
        if (node != null)
        {
        	inOrder(node.getLeft());
        	System.out.print(node.getData()+"  ");
        	inOrder(node.getRight());
        }
    }

    /**
     *  遞歸 後續遍歷
     */
    public void postOrder(TreeNode node)
    {
        if (node != null)
        {
        	postOrder(node.getLeft());
        	postOrder(node.getRight());
        	 System.out.print(node.getData()+"  ");
        }
    }
    
    /**
     *  非遞歸 前續遍歷
     */
    public void preOrderNoRecursion() 
    { 
        LinkedList stack = new LinkedList(); 
        stack.push(root); 
        TreeNode current = null; 
        while (!stack.isEmpty()) 
        { 
            current = stack.pop(); 
            System.out.print(current.data+"  "); 
            if (current.getRight() != null) 
                stack.push(current.getRight()); 
            if (current.getLeft() != null) 
                stack.push(current.getLeft()); 
        } 
        System.out.println(); 
    } 
    
    /**
     *  非遞歸 中續遍歷
     */
    public void inorderNoRecursion() 
    { 
        LinkedList stack = new LinkedList(); 
        TreeNode current = root; 
        while (current != null || !stack.isEmpty()) 
        { 
            while(current != null) 
            { 
                stack.push(current); 
                current = current.getLeft(); 
            } 
            if (!stack.isEmpty()) 
            { 
                current = stack.pop(); 
                System.out.print(current.data+"  "); 
                current = current.getRight(); 
            } 
        } 
        System.out.println(); 
    } 
    
    /**
     *  非遞歸 後續遍歷
     */
    public void postorderNoRecursion() 
    { 
        TreeNode rNode = null; 
        TreeNode current = root; 
        LinkedList stack = new LinkedList(); 
        while(current != null || !stack.isEmpty()) 
        { 
            while(current != null) 
            { 
                stack.push(current); 
                current = current.getLeft(); 
            } 
            current = stack.pop(); 
            while (current != null && (current.getRight() == null ||current.getRight() == rNode)) 
            { 
                System.out.print(current.data+"  "); 
                rNode = current; 
                if (stack.isEmpty())
                { 
                    System.out.println(); 
                    return; 
                } 
                current = stack.pop(); 
            } 
            stack.push(current); 
            current = current.getRight(); 
        }          
    } 
    
    public static void main(String[] args)
    {
        TreeNode l2 = new TreeNode("E", null, null);//這五行構造一棵二叉樹
        TreeNode r2 = new TreeNode("D", null, null);
        TreeNode l1 = new TreeNode("B",null, r2);// 根節點左子樹
        TreeNode r1 = new TreeNode("C", l2, null);// 根節點右子樹
        TreeNode root = new TreeNode("A", l1, r1);// 創建根節點

        BinaryTree bt = new BinaryTree(root);
        System.out.print(" 遞歸 前序遍歷------->");
        bt.preOrder(bt.getRoot());
        System.out.print(" 非遞歸 前序遍歷------->");
        bt.postorderNoRecursion();
        System.out.print(" 遞歸 中序遍歷------->");
        bt.inOrder(bt.getRoot());
        System.out.print(" 非遞歸 中序遍歷------->");
        bt.inorderNoRecursion();
        System.out.print(" 遞歸 後序遍歷------->");
        bt.postOrder(bt.getRoot());
        System.out.print(" 非遞歸 後序遍歷------->");
        bt.postorderNoRecursion();
        
    }
}
    
遞歸 前序遍歷------->A B D C E 非遞歸 前序遍歷------->D B E C A
遞歸 中序遍歷------->B D A E C 非遞歸 中序遍歷------->B D A E C
遞歸 後序遍歷------->D B E C A 非遞歸 後序遍歷------->D B E C A



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