前序遍歷的非遞歸算法

轉載於:https://blog.csdn.net/weixin_42130471/article/details/80319821

方法一:

void PreOrderWithoutRecursion1(BTNode* root)
{
    if (root == NULL)
        return;
    BTNode* p = root;
    stack<btnode*> s;
    while (!s.empty() || p)
    {
        //邊遍歷邊打印,並存入棧中,以後需要藉助這些根節點(不要懷疑這種說法哦)進入右子樹
        while (p)
        {
            cout << setw(4) << p->data;
            s.push(p);
            p = p->lchild;
        }
        //當p爲空時,說明根和左子樹都遍歷完了,該進入右子樹了
        if (!s.empty())
        {
            p = s.top();
            s.pop();
            p = p->rchild;
        }
    }
    cout << endl;
}</btnode*>
方法二:

void PreOrderWithoutRecursion2(BTNode* root)
{
    if (root == NULL)
        return;
    BTNode* p = root;
    stack<btnode*> s;
    while (!s.empty() || p)
    {
        if (p)
        {
            cout << setw(4) << p->data;
            s.push(p);
            p = p->lchild;
        }
        else
        {
            p = s.top();
            s.pop();
            p = p->rchild;
        }
    }
    cout << endl;
}</btnode*>
方法三:

public void preOrderWithoutRecursion(TreeNode T){ //前序遍歷非遞歸算法  
          
        TreeNode p;  
        Stack<TreeNode> stack = new Stack<TreeNode>();  
        stack.push(T);             //先將根節點壓進棧中  
        while(T!=null&&!stack.empty()){  
            p = stack.pop();        //彈出棧頂的節點賦給p  
            System.out.println(p.data);  //用輸出來代替對節點的處理  
            if(p.rchild!=null){             
                stack.push(p.rchild);      //如果彈出節點的右孩子不爲空則壓入棧  
            }                           //注意,這裏的重點是一定要先將右孩子壓入棧,再將左孩子壓入  
            if(p.lchild!=null){  
                stack.push(p.lchild);     //如果彈出節點的左孩子不爲空則壓入棧  
            }         
        }     
          
    } 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章