<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Hexise's Blog

    業精于勤荒于嬉 行成于思毀于隨
    posts - 13, comments - 12, trackbacks - 0, articles - 0
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    [復習基礎]Java的二叉樹遍歷操作(遞歸, 非遞歸)

    Posted on 2006-12-29 13:01 Hexise 閱讀(4429) 評論(2)  編輯  收藏 所屬分類: J2SE
    樹節點定義:

    class?TreeNode?{
    ????
    public?TreeNode?left;

    ????
    public?TreeNode?right;

    ????
    public?int?value;

    ????
    public?TreeNode(TreeNode?left,?TreeNode?right,?int?value)?{
    ????????
    this.left?=?left;
    ????????
    this.right?=?right;
    ????????
    this.value?=?value;
    ????}

    }

    二叉樹及其操作:

    public?class?BinaryTree?{

    ????
    public?static?int?getTreeHeight(TreeNode?root)?{
    ????????
    if?(root?==?null)
    ????????????
    return?0;
    ????????
    if?(root.left?==?null?&&?root.right?==?null)
    ????????????
    return?1;
    ????????
    return?1?+?Math
    ????????????????.max(getTreeHeight(root.left),?getTreeHeight(root.right));
    ????}


    ????
    public?static?void?recursePreOrder(TreeNode?root)?{
    ????????
    if?(root?==?null)
    ????????????
    return;
    ????????System.out.println(root.value);
    ????????
    if?(root.left?!=?null)
    ????????????recursePreOrder(root.left);
    ????????
    if?(root.right?!=?null)
    ????????????recursePreOrder(root.right);
    ????}


    ????
    public?static?void?stackPreOrder(TreeNode?root)?{
    ????????Stack?stack?
    =?new?Stack();
    ????????
    if?(root?==?null)
    ????????????
    return;
    ????????stack.push(root);
    ????????System.out.println(root.value);
    ????????TreeNode?temp?
    =?root.left;
    ????????
    while?(temp?!=?null)?{
    ????????????stack.push(temp);
    ????????????System.out.println(temp.value);
    ????????????temp?
    =?temp.left;
    ????????}

    ????????temp?
    =?(TreeNode)?stack.pop();
    ????????
    while?(temp?!=?null)?{
    ????????????temp?
    =?temp.right;
    ????????????
    while?(temp?!=?null)?{
    ????????????????stack.push(temp);
    ????????????????System.out.println(temp.value);
    ????????????????temp?
    =?temp.left;
    ????????????}

    ????????????
    if?(stack.empty())
    ????????????????
    break;
    ????????????temp?
    =?(TreeNode)?stack.pop();
    ????????}

    ????}


    ????
    public?static?void?recurseInOrder(TreeNode?root)?{
    ????????
    if?(root?==?null)
    ????????????
    return;
    ????????
    if?(root.left?!=?null)
    ????????????recurseInOrder(root.left);
    ????????System.out.println(root.value);
    ????????
    if?(root.right?!=?null)
    ????????????recurseInOrder(root.right);
    ????}


    ????
    public?static?void?stackInOrder(TreeNode?root)?{
    ????????Stack?stack?
    =?new?Stack();
    ????????
    if?(root?==?null)
    ????????????
    return;
    ????????
    else
    ????????????stack.push(root);
    ????????TreeNode?temp?
    =?root.left;
    ????????
    while?(temp?!=?null)?{
    ????????????stack.push(temp);
    ????????????temp?
    =?temp.left;
    ????????}

    ????????temp?
    =?(TreeNode)?stack.pop();
    ????????
    while?(temp?!=?null)?{
    ????????????System.out.println(temp.value);
    ????????????temp?
    =?temp.right;
    ????????????
    while?(temp?!=?null)?{
    ????????????????stack.push(temp);
    ????????????????temp?
    =?temp.left;
    ????????????}

    ????????????
    if?(stack.empty())
    ????????????????
    break;
    ????????????temp?
    =?(TreeNode)?stack.pop();
    ????????}

    ????}


    ????
    public?static?void?main(String[]?args)?{
    ????????TreeNode?node1?
    =?new?TreeNode(null,?null,?1);
    ????????TreeNode?node2?
    =?new?TreeNode(null,?node1,?2);
    ????????TreeNode?node3?
    =?new?TreeNode(null,?null,?3);
    ????????TreeNode?node4?
    =?new?TreeNode(node2,?node3,?4);
    ????????TreeNode?node5?
    =?new?TreeNode(null,?null,?5);
    ????????TreeNode?root?
    =?new?TreeNode(node4,?node5,?0);
    ????????System.out.println(
    "Tree?Height?is?"?+?getTreeHeight(root));
    ????????System.out.println(
    "Recurse?In?Order?Traverse");
    ????????recurseInOrder(root);
    ????????System.out.println(
    "Stack?In?Order?Traverse");
    ????????stackInOrder(root);
    ????????System.out.println(
    "Recurse?Pre?Order?Traverse");
    ????????recursePreOrder(root);
    ????????System.out.println(
    "Stack?Pre?Order?Traverse");
    ????????stackPreOrder(root);
    ????}

    }

    用LinkedList重寫的Stack:

    import?java.util.EmptyStackException;
    import?java.util.LinkedList;

    public?class?Stack?{

    ????
    private?LinkedList?list;

    ????
    public?Stack()?{
    ????????
    this.list?=?new?LinkedList();
    ????}


    ????
    public?boolean?empty()?{
    ????????
    return?list.isEmpty();
    ????}


    ????
    public?Object?peek()?{
    ????????
    if?(empty())
    ????????????
    throw?new?EmptyStackException();
    ????????
    return?list.getLast();
    ????}


    ????
    public?Object?pop()?{
    ????????
    if?(empty())
    ????????????
    throw?new?EmptyStackException();
    ????????
    return?list.removeLast();
    ????}


    ????
    public?void?push(Object?o)?{
    ????????list.add(o);
    ????}


    ????
    public?static?void?main(String[]?args)?{
    ????????Stack?stack?
    =?new?Stack();
    ????????stack.push(
    new?Integer(1));
    ????????stack.push(
    new?Integer(11));
    ????????stack.push(
    new?Integer(1111));
    ????????stack.push(
    new?Integer(22));
    ????????stack.push(
    new?Integer(222));
    ????????stack.push(
    new?Integer(31));
    ????????stack.push(
    new?Integer(221));
    ????????
    while?(!stack.empty())?{
    ????????????System.out.println(stack.pop());
    ????????}

    ????}

    }

    評論

    # re: [復習基礎]Java的二叉樹遍歷操作(遞歸, 非遞歸)  回復  更多評論   

    2007-06-26 11:35 by Hexise
    [更新]加入廣度遍歷的BinaryTree:
     
    public class BinaryTree {
        
    public static int getTreeHeight(TreeNode root) {
            
    if (root == null)
                
    return 0;
            
    if (root.left == null && root.right == null)
                
    return 1;
            
    return 1 + Math
                    .max(getTreeHeight(root.left), getTreeHeight(root.right));
        }


        
    public static void recursePreOrder(TreeNode root) {
            
    if (root == null)
                
    return;
            visit(root);
            
    if (root.left != null)
                recursePreOrder(root.left);
            
    if (root.right != null)
                recursePreOrder(root.right);
        }


        
    public static void stackPreOrder(TreeNode root) {
            Stack stack 
    = new Stack();
            
    if (root == null)
                
    return;
            stack.push(root);
            visit(root);
            TreeNode temp 
    = root.left;
            
    while (temp != null{
                stack.push(temp);
                visit(temp);
                temp 
    = temp.left;
            }

            temp 
    = (TreeNode) stack.pop();
            
    while (temp != null{
                temp 
    = temp.right;
                
    while (temp != null{
                    stack.push(temp);
                    visit(temp);
                    temp 
    = temp.left;
                }

                
    if (stack.empty())
                    
    break;
                temp 
    = (TreeNode) stack.pop();
            }

        }


        
    public static void recurseInOrder(TreeNode root) {
            
    if (root == null)
                
    return;
            
    if (root.left != null)
                recurseInOrder(root.left);
            visit(root);
            
    if (root.right != null)
                recurseInOrder(root.right);
        }


        
    public static void stackInOrder(TreeNode root) {
            Stack stack 
    = new Stack();
            
    if (root == null)
                
    return;
            
    else
                stack.push(root);
            TreeNode temp 
    = root.left;
            
    while (temp != null{
                stack.push(temp);
                temp 
    = temp.left;
            }

            temp 
    = (TreeNode) stack.pop();
            
    while (temp != null{
                visit(temp);
                temp 
    = temp.right;
                
    while (temp != null{
                    stack.push(temp);
                    temp 
    = temp.left;
                }

                
    if (stack.empty())
                    
    break;
                temp 
    = (TreeNode) stack.pop();
            }

        }

        
        
    public static void widthTraverse(TreeNode root) {
            Queue queue 
    = new Queue();
            queue.push(root);
            traverseLevel(queue);
        }

        
        
    public static void traverseLevel(Queue queue){
            
    for(int i=0; i<queue.size(); i++){
                TreeNode node 
    = (TreeNode)queue.pop();
                visit(node);
                
    if(node.left != null)
                    queue.push(node.left);
                
    if(node.right != null)
                    queue.push(node.right);
            }

            
    if(queue.size() > 0)
                traverseLevel(queue);
        }


        
    private static void visit(TreeNode node) {
            System.out.println(node.value);
        }


        
    public static void main(String[] args) {
            TreeNode node1 
    = new TreeNode(nullnull1);
            TreeNode node2 
    = new TreeNode(null, node1, 2);
            TreeNode node3 
    = new TreeNode(nullnull3);
            TreeNode node4 
    = new TreeNode(node2, node3, 4);
            TreeNode node5 
    = new TreeNode(nullnull5);
            TreeNode root 
    = new TreeNode(node4, node5, 0);
            System.out.println(
    "Tree Height is " + getTreeHeight(root));
            System.out.println(
    "Recurse In Order Traverse");
            recurseInOrder(root);
            System.out.println(
    "Stack In Order Traverse");
            stackInOrder(root);
            System.out.println(
    "Recurse Pre Order Traverse");
            recursePreOrder(root);
            System.out.println(
    "Stack Pre Order Traverse");
            stackPreOrder(root);
            System.out.println(
    "Width Traverse");
            widthTraverse(root);
        }


    }


    用LinkedList實現的Queue:
     
    import java.util.EmptyStackException;
    import java.util.LinkedList;

    public class Queue {
        
    private LinkedList list;

        
    public Queue() {
            
    this.list = new LinkedList();
        }


        
    public boolean empty() {
            
    return list.isEmpty();
        }


        
    public Object peek() {
            
    if (empty())
                
    throw new EmptyStackException();
            
    return list.getFirst();
        }


        
    public Object pop() {
            
    if (empty())
                
    throw new EmptyStackException();
            
    return list.removeFirst();
        }


        
    public void push(Object o) {
            list.add(o);
        }

        
        
    public int size(){
            
    return list.size();
        }


        
    public static void main(String[] args) {
            Queue queue 
    = new Queue();
            queue.push(
    new Integer(1));
            queue.push(
    new Integer(11));
            queue.push(
    new Integer(1111));
            queue.push(
    new Integer(22));
            queue.push(
    new Integer(222));
            queue.push(
    new Integer(31));
            queue.push(
    new Integer(221));
            
    while (!queue.empty()) {
                System.out.println(queue.pop());
            }

        }

    }

    # re: [復習基礎]Java的二叉樹遍歷操作(遞歸, 非遞歸)  回復  更多評論   

    2007-09-02 14:36 by diligentjason
    我用generics 也寫了一個
    主站蜘蛛池模板: 全部免费国产潢色一级| 久久精品国产亚洲AV不卡| 另类专区另类专区亚洲| 久久亚洲中文字幕精品一区四| 在线观看人成视频免费无遮挡| 91亚洲自偷在线观看国产馆| 国产又大又长又粗又硬的免费视频| 久久免费视频一区| 亚洲一区二区三区四区视频| 免费人成视频在线观看视频| 69国产精品视频免费| 亚洲av无码一区二区三区天堂 | a毛片免费全部在线播放**| 久久精品国产亚洲av影院| 亚洲AⅤ优女AV综合久久久| 久久久久国色av免费看| 亚洲av成人中文无码专区| 久久精品国产精品亚洲蜜月| 免费观看毛片视频| 永久免费AV无码网站国产| 亚洲国产欧美国产综合一区 | 亚洲高清资源在线观看| 国产在线不卡免费播放| 1000部拍拍拍18勿入免费视频下载| 真正全免费视频a毛片| 亚洲人成影院午夜网站| 久久被窝电影亚洲爽爽爽| 国产a不卡片精品免费观看| 日本片免费观看一区二区| 最近更新免费中文字幕大全| 亚洲av色香蕉一区二区三区| 亚洲成a人片7777| 久久久久久久尹人综合网亚洲| 国产成人免费a在线资源| 免费观看美女用震蛋喷水的视频| 中文字幕av免费专区| 久久精品国产亚洲AV| 亚洲人xxx日本人18| 日木av无码专区亚洲av毛片| 亚洲精品无码精品mV在线观看 | 亚洲jizzjizz在线播放久|