二查數的非遞迴實現

來源:互聯網
上載者:User

//先序遍曆的非遞迴演算法
   private void preOrderTraverse(BinTreeNode rt, LinkedList list){
   if (rt==null) return;
   BinTreeNode p = rt;
   Stack s = new StackSLinked();
   while (p!=null){
    while (p!=null){         //向左走到盡頭
     list.insertLast(p);        //訪問根
     if (p.hasRChild()) s.push(p.getRChild()); //右子樹根結點入棧
     p = p.getLChild();      
    }
    if (!s.isEmpty()) p = (BinTreeNode)s.pop();   //右子樹根退棧遍曆右子樹
   }
}

//中序遍曆的非遞迴演算法
private void inOrderTraverse(BinTreeNode rt, LinkedList list){
   if (rt==null) return;
   BinTreeNode p = rt;
   Stack s = new StackSLinked();
   while (p!=null||!s.isEmpty()){
    while (p!=null){   //一直向左走
     s.push(p);    //將根結點入棧
     p = p.getLChild();
    }
    if (!s.isEmpty()){
     p = (BinTreeNode)s.pop();//取出棧頂根結點訪問之
     list.insertLast(p);
     p = p.getRChild();   //轉向根的右子樹進行遍曆
    }//if
   }//out while
}

//後序遍曆的非遞迴演算法
private void postOrderTraverse(BinTreeNode rt, LinkedList list){
   if (rt==null) return;
   BinTreeNode p = rt;
   Stack s = new StackSLinked();
   while(p!=null||!s.isEmpty()){
    while (p!=null){   //先左後右不斷深入
     s.push(p);    //將根節點入棧
     if (p.hasLChild()) p = p.getLChild();
     else p = p.getRChild();
    }
    if (!s.isEmpty()){
     p = (BinTreeNode)s.pop();   //取出棧頂根結點訪問之
     list.insertLast(p);
    }
    //滿足條件時,說明棧頂根節點右子樹已訪問,應出棧訪問之
    while (!s.isEmpty()&&((BinTreeNode)s.peek()).getRChild()==p){
     p = (BinTreeNode)s.pop();
     list.insertLast(p);
    }
    //轉向棧頂根結點的右子樹繼續後序遍曆
    if (!s.isEmpty()) p = ((BinTreeNode)s.peek()).getRChild();
    else p = null;
   }
}

//使用隊列完成二叉樹的層次遍曆
private void levelOrderTraverse(BinTreeNode rt, LinkedList list){
   if (rt==null) return;
   Queue q = new QueueArray();
   q.enqueue(rt);    //根結點入隊
   while (!q.isEmpty()){
    BinTreeNode p = (BinTreeNode)q.dequeue(); //取出隊首結點p並訪問
    list.insertLast(p);
    if (p.hasLChild()) q.enqueue(p.getLChild());//將p的非空左右孩子依次入隊
    if (p.hasRChild()) q.enqueue(p.getRChild());
   }
}

聯繫我們

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