1. 程式人生 > >中序遍歷非遞迴演算法

中序遍歷非遞迴演算法

中序遍歷:

方法一:

//中序遍歷
void InOrderWithoutRecursion1(BTNode* root)
{
    //空樹
    if (root == NULL)
        return;
    //樹非空
    BTNode* p = root;
    stack<btnode*> s;
    while (!s.empty() || p)
    {
        //一直遍歷到左子樹最下邊,邊遍歷邊儲存根節點到棧中
        while (p)
        {
            s.push(p);
            p = p->lchild;
        }
        //當p為空時,說明已經到達左子樹最下邊,這時需要出棧了
        if (!s.empty())
        {
            p = s.top();
            s.pop();
            cout << setw(4) << p->data;
            //進入右子樹,開始新的一輪左子樹遍歷(這是遞迴的自我實現)
            p = p->rchild;
        }
    }
}</btnode*>

方法二:

//中序遍歷
void InOrderWithoutRecursion2(BTNode* root)
{
    //空樹
    if (root == NULL)
        return;
    //樹非空
    BTNode* p = root;
    stack<btnode*> s;
    while (!s.empty() || p)
    {
        if (p)
        {
            s.push(p);
            p = p->lchild;
        }
        else
        {
            p = s.top();
            s.pop();
            cout << setw(4) << p->data;
            p = p->rchild;
        }
    }
}</btnode*>

方法三:

public void InOrderWithoutRecursion(TreeNode T){  
          
        Stack<TreeNode> stack = new Stack<TreeNode>();  
        TreeNode p;  
        while(T!=null||!stack.empty()){  
              
            while(T!=null){             //將結點壓進棧中  
                stack.push(T);  
                T = T.lchild;  
            }  
              
            if(!stack.empty()){         //將棧中的結點彈出  
                p = stack.peek();    
                stack.pop();  
                System.out.println(p.data);                   
                T = p.rchild;             
            }  
        }  
                  
    }