二叉树的遍历

 // Definition for a binary tree node.
struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

1、递归

// A.前序遍历(DLR, 根左右)
vector<int> res;
void DLR(TreeNode* root) {
    if (root) {
        res.emplace_back(root-> val);
        DLR(root-> left);
        DLR(root -> right);
    }
}

// B.中序遍历(LDR, 左根右)
vector<int> res;
void LDR(TreeNode* root) {
    if (root) {
        LDR(root-> left);
        res.emplace_back(root-> val);
        LDR(root-> right);
    }
}

// C.后序遍历(LRD, 左右根)
vector<int> res;
void LRD(TreeNode* root) {
    if (root) {
        LRD(root -> left);
        LRD(root -> right);
        res.emplace_back(root -> val);
    }
}

2、非递归

// X.层次遍历
vector<int> res;
void levelOrder(TreeNode* root) {
    queue que;
    que.push(root);
    while (!que.empty()) {
        TreeNode* node = que.front();
        que.pop();
        if (!node) {
            continue;
        }
        res.emplace_back(node -> val);
        que.push(node -> left);
        que.push(node -> right);
    }
}

// A.前序遍历
vector<int> res;
void preorderTraversal(TreeNode* root) {
    stack<TreeNode*> stk;
    stk.push(root);
    while (!stk.empty()) {
        TreeNode* node = stk.top();
        stk.pop();
        if (!node) {
            continue;
        }
        res.emplace_back(node-> val);
        stk.push(node-> right);
        stk.push(node-> left);
    }
}

// B.中序遍历
vector<int> res;
void inorderTraversal(TreeNode* root) {
    stack<TreeNode*> stk;
    TreeNode* cur = root;
    while (cur || !stk.empty()) {
        while (cur) {
            stk.push(cur);
            cur = cur -> left;
        }
        cur = stk.top();
        stk.pop();
        res.push_back(cur -> val);
        cur = cur -> right;
    }
}

// C.后序遍历
vector<int> res;
void postorderTraversal(TreeNode* root) {
    stack<TreeNode*> stk;
    stk.push(root);
    while (!stk.empty()) {
        TreeNode *node = stk.top();
        stk.pop();
        if (!node) {
            continue;
        }
        res.push_back(node -> val);
        stk.push(node -> left);
        stk.push(node -> right);
    }
    reverse(res.begin(), res.end());
}

3、Morris法

// A.前序遍历
vector<int> res;
void preorderTraversal(TreeNode* cur) {
    TreeNode* pre;
    while (cur) {
        if (cur -> left) {
            pre = cur -> left;
            while (pre -> right && pre -> right != cur) {
                pre = pre -> right;
            }
            if (pre -> right == nullptr) {
                res.emplace_back(cur -> val);
                pre -> right = cur;
                cur = cur -> left;
            } else {
                pre -> right = nullptr;
                cur = cur -> right;
            }
        } else {
            res.emplace_back(cur -> val);
            cur = cur -> right;
        }
    }
}

// B.中序遍历
vector<int> res;
void inorderTraversal(TreeNode* cur) {
    TreeNode* pre;
    while (cur) {
        if (cur -> left) {
            pre = cur -> left;
            while (pre -> right && pre -> right != cur) {
                pre = pre -> right;
            }
            if (pre -> right == nullptr) {
                pre -> right = cur;
                cur = cur -> left;
            } else {
                res.emplace_back(cur -> val);
                pre -> right = nullptr;
                cur = cur -> right;
            }
        } else {
            res.emplace_back(cur -> val);
            cur = cur -> right;
        }
    }
}

// C.后序遍历
vector<int> res;
void postorderTraversal(TreeNode* cur) {
    TreeNode* pre;
    while (cur) {
        if (cur -> right) {
            pre = cur -> right;
            while (pre -> left && pre -> left != cur) {
                pre = pre -> left;
            }
            if (pre -> left == nullptr) {
                res.emplace_back(cur -> val);
                pre -> left = cur;
                cur = cur -> right;
            } else {
                pre -> left = nullptr;
                cur = cur -> left;
            }
        } else {
            res.emplace_back(cur -> val);
            cur = cur -> left;
        }
    }
    reverse(res.begin(), res.end());
}
全部评论

相关推荐

如题,这操作。。。。
真烦好烦真烦:既想享受国家的招聘应届生福利,又不想培养新人,我只能说这种企业的ld太过分了
投递美的集团等公司6个岗位 >
点赞 评论 收藏
分享
03-11 21:46
西北大学 Java
河和静子:这只是实习工资,我学长北大通班博一的,他同学被这家天天发邮件让他去实习,一个月10w
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务