1. 程式人生 > 其它 >二叉樹中序遍歷Joseph M. Morris演算法

二叉樹中序遍歷Joseph M. Morris演算法

二叉樹中序遍歷,一種方法是遞迴,leetcode上的非遞迴方法有一種是用棧實現的,想來也沒多大優化,手動遞迴比自動遞迴也快不了多少。還有一種不用棧的非遞迴方法,是Joseph M. Morris發明的,這位元老就是KMP演算法中的M。

下面程式碼來自貼吧大神,經測試可用。我還沒研究具體是個怎麼回事,時間上能達到100%

vector<int> inorderTraversal(TreeNode* p)
{
    vector<int> res;
    TreeNode* r = nullptr;
    while (p) {
        TreeNode* q = p->left;
        if (q) {
            while (q != r && q->right)
                q = q->right;
            if (q != r) {
                q->right = p;
                p = p->left;
                continue;
            } else
                q->right = NULL;
        }
        // printf("%d\n", p->val);
        res.push_back(p->val);
        r = p;
        p = p->right;
    }
    return res;
}