二叉树遍历算法

1.树层次遍历算法,返回树深度

#include <iostream>
#include <queue>

struct TreeNode {
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

int maxDepth(TreeNode* root) {
    if (root == nullptr) {
        return 0;
    }

    std::queue<TreeNode*> q;
    q.push(root);
    int depth = 0;

    while (!q.empty()) {
        int levelSize = q.size();
        depth++; // 进入下一层
        for (int i = 0; i < levelSize; i++) {
            TreeNode* node = q.front();
            q.pop();

            if (node->left != nullptr) {
                q.push(node->left);
            }
            if (node->right != nullptr) {
                q.push(node->right);
            }
        }
    }

    return depth;
}

int main() {
    // 构建一个二叉树
    TreeNode* root = new TreeNode(1);
    root->left = new TreeNode(2);
    root->right = new TreeNode(3);
    root->left->left = new TreeNode(4);
    root->left->right = new TreeNode(5);
    root->right->right = new TreeNode(6);

    std::cout << "Depth of the tree: " << maxDepth(root) << std::endl;

    // 释放内存,防止内存泄漏
    delete root->left->left;
    delete root->left->right;
    delete root->right->right;
    delete root->left;
    delete root->right;
    delete root;

    return 0;
}

2.树前序遍历(非递归)

#include <iostream>
#include <stack>
#include <vector>

struct TreeNode {
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

std::vector<int> preorderTraversal(TreeNode* root) {
    std::vector<int> result;
    std::stack<TreeNode*> stk;
    TreeNode* current = root;

    while (current != nullptr || !stk.empty()) {
        if (current != nullptr) {
            // 访问当前节点
            result.push_back(current->val);
            // 将当前节点的右子树压栈
            if (current->right != nullptr) {
                stk.push(current->right);
            }
            // 继续访问当前节点的左子树
            current = current->left;
        } else {
            // 当前节点为空时,弹出栈顶节点,并将其赋值给 current
            current = stk.top();
            stk.pop();
        }
    }

    return result;
}

int main() {
    // 构建一个二叉树
    TreeNode* root = new TreeNode(1);
    root->left = new TreeNode(2);
    root->right = new TreeNode(3);
    root->left->left = new TreeNode(4);
    root->left->right = new TreeNode(5);

    // 非递归前序遍历二叉树
    std::vector<int> result = preorderTraversal(root);

    // 输出遍历结果
    std::cout << "Preorder traversal result: ";
    for (int num : result) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    // 释放内存
    delete root->left->left;
    delete root->left->right;
    delete root->left;
    delete root->right;
    delete root;

    return 0;
}

3.树中序遍历(非递归)

#include <iostream>
#include <stack>
#include <vector>

struct TreeNode {
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

std::vector<int> inorderTraversal(TreeNode* root) {
    std::vector<int> result;
    std::stack<TreeNode*> stk;
    TreeNode* current = root;

    while (current != nullptr || !stk.empty()) {
        if (current != nullptr) {
            // 将当前节点及其左子树压栈
            stk.push(current);
            current = current->left;
        } else {
            // 当前节点为空时,弹出栈顶节点并访问,然后继续遍历其右子树
            current = stk.top();
            stk.pop();
            result.push_back(current->val);
            current = current->right;
        }
    }

    return result;
}

int main() {
    // 构建一个二叉树
    TreeNode* root = new TreeNode(1);
    root->left = new TreeNode(2);
    root->right = new TreeNode(3);
    root->left->left = new TreeNode(4);
    root->left->right = new TreeNode(5);

    // 非递归中序遍历二叉树
    std::vector<int> result = inorderTraversal(root);

    // 输出遍历结果
    std::cout << "Inorder traversal result: ";
    for (int num : result) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    // 释放内存
    delete root->left->left;
    delete root->left->right;
    delete root->left;
    delete root->right;
    delete root;

    return 0;
}

4.树后序遍历(非递归)

#include <iostream>
#include <stack>
#include <vector>

struct TreeNode {
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

std::vector<int> postorderTraversal(TreeNode* root) {
    std::vector<int> result;
    std::stack<TreeNode*> stk;
    TreeNode* current = root;
    TreeNode* lastVisited = nullptr;

    while (current != nullptr || !stk.empty()) {
        if (current != nullptr) {
            // 将当前节点及其左子树压栈
            stk.push(current);
            current = current->left;
        } else {
            TreeNode* topNode = stk.top();
            // 如果当前节点的右子树为空,或者已经访问过了右子树,那么就可以访问当前节点
            if (topNode->right == nullptr || topNode->right == lastVisited) {
                result.push_back(topNode->val);
                lastVisited = topNode;
                stk.pop();
            } else {
                // 否则,继续遍历右子树
                current = topNode->right;
            }
        }
    }

    return result;
}

int main() {
    // 构建一个二叉树
    TreeNode* root = new TreeNode(1);
    root->left = new TreeNode(2);
    root->right = new TreeNode(3);
    root->left->left = new TreeNode(4);
    root->left->right = new TreeNode(5);

    // 非递归后序遍历二叉树
    std::vector<int> result = postorderTraversal(root);

    // 输出遍历结果
    std::cout << "Postorder traversal result: ";
    for (int num : result) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    // 释放内存
    delete root->left->left;
    delete root->left->right;
    delete root->left;
    delete root->right;
    delete root;

    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值