<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 也寫了一個
    主站蜘蛛池模板: 亚洲精品成人无码中文毛片不卡| 免费理论片51人人看电影| 亚洲国产综合精品中文字幕| 亚洲偷自拍另类图片二区| 我想看一级毛片免费的| 国产成人精品日本亚洲专| 永久免费无码网站在线观看| 最新亚洲人成网站在线观看| 国产精品国产午夜免费福利看| 亚洲精品无码一区二区| 日韩亚洲精品福利| fc2免费人成为视频| 亚洲精品乱码久久久久久久久久久久 | 婷婷亚洲综合五月天小说| 免费在线看污视频| 亚洲欧洲日韩在线电影| 99视频在线精品免费观看6| 久久精品国产亚洲AV天海翼| 亚洲美女在线国产| 久久精品成人免费看| 91亚洲视频在线观看| 德国女人一级毛片免费| 一边摸一边桶一边脱免费视频 | 亚洲国产美国国产综合一区二区| 精品无码AV无码免费专区| 国产人成亚洲第一网站在线播放| 国产成人在线免费观看| 国产在线精品一区免费香蕉| 亚洲永久永久永久永久永久精品| 日韩欧毛片免费视频| 免费看内射乌克兰女| 亚洲尹人九九大色香蕉网站| 免费观看一级毛片| a毛片免费播放全部完整| 亚洲一区二区三区免费观看| 亚洲高清偷拍一区二区三区| 69pao强力打造免费高清| 国产av无码专区亚洲av毛片搜| 亚洲av午夜福利精品一区人妖| 成人女人A级毛片免费软件| a一级毛片免费高清在线|