二叉树简述+考试要点(C++)

二叉树的基本概念

二叉树是一种树形数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。

  • 特点

    • 每个节点最多有两个子节点。
    • 左子树和右子树有顺序,不可颠倒。
    • 空树(无节点)或由根节点和左右子树组成。
  • 常见术语

    • 根节点:树的顶层节点。
    • 叶子节点:没有子节点的节点。
    • 深度:从根节点到某节点的路径长度。
    • 高度:从某节点到叶子节点的最长路径。

二叉树的遍历方式(C++实现)

遍历是二叉树的核心操作,分为递归和非递归实现。

前序遍历(根-左-右)

递归实现:

cpp 复制代码
void preOrder(TreeNode* root) {
    if (root == nullptr) return;
    cout << root->val << " ";
    preOrder(root->left);
    preOrder(root->right);
}

非递归实现(使用栈):

cpp 复制代码
void preOrderStack(TreeNode* root) {
    stack<TreeNode*> st;
    if (root) st.push(root);
    while (!st.empty()) {
        TreeNode* node = st.top();
        st.pop();
        cout << node->val << " ";
        if (node->right) st.push(node->right);
        if (node->left) st.push(node->left);
    }
}
中序遍历(左-根-右)

递归实现:

cpp 复制代码
void inOrder(TreeNode* root) {
    if (root == nullptr) return;
    inOrder(root->left);
    cout << root->val << " ";
    inOrder(root->right);
}

非递归实现:

cpp 复制代码
void inOrderStack(TreeNode* root) {
    stack<TreeNode*> st;
    TreeNode* curr = root;
    while (curr || !st.empty()) {
        while (curr) {
            st.push(curr);
            curr = curr->left;
        }
        curr = st.top();
        st.pop();
        cout << curr->val << " ";
        curr = curr->right;
    }
}
后序遍历(左-右-根)

递归实现:

cpp 复制代码
void postOrder(TreeNode* root) {
    if (root == nullptr) return;
    postOrder(root->left);
    postOrder(root->right);
    cout << root->val << " ";
}

非递归实现(双栈法):

cpp 复制代码
void postOrderStack(TreeNode* root) {
    stack<TreeNode*> st1, st2;
    if (root) st1.push(root);
    while (!st1.empty()) {
        TreeNode* node = st1.top();
        st1.pop();
        st2.push(node);
        if (node->left) st1.push(node->left);
        if (node->right) st1.push(node->right);
    }
    while (!st2.empty()) {
        cout << st2.top()->val << " ";
        st2.pop();
    }
}

二叉树常见考点

  1. 求二叉树的最大深度
cpp 复制代码
int maxDepth(TreeNode* root) {
    if (root == nullptr) return 0;
    return 1 + max(maxDepth(root->left), maxDepth(root->right));
}
  1. 判断对称二叉树
cpp 复制代码
bool isSymmetric(TreeNode* root) {
    if (!root) return true;
    return helper(root->left, root->right);
}

bool helper(TreeNode* left, TreeNode* right) {
    if (!left && !right) return true;
    if (!left || !right) return false;
    return (left->val == right->val) && 
           helper(left->left, right->right) && 
           helper(left->right, right->left);
}
  1. 二叉树的层序遍历(BFS)
cpp 复制代码
vector<vector<int>> levelOrder(TreeNode* root) {
    vector<vector<int>> res;
    if (!root) return res;
    queue<TreeNode*> q;
    q.push(root);
    while (!q.empty()) {
        int size = q.size();
        vector<int> level;
        for (int i = 0; i < size; ++i) {
            TreeNode* node = q.front();
            q.pop();
            level.push_back(node->val);
            if (node->left) q.push(node->left);
            if (node->right) q.push(node->right);
        }
        res.push_back(level);
    }
    return res;
}
  1. 重建二叉树(前序+中序)
cpp 复制代码
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
    unordered_map<int, int> inMap;
    for (int i = 0; i < inorder.size(); ++i) {
        inMap[inorder[i]] = i;
    }
    return helper(preorder, 0, preorder.size()-1, inorder, 0, inorder.size()-1, inMap);
}

TreeNode* helper(vector<int>& preorder, int preStart, int preEnd, 
                 vector<int>& inorder, int inStart, int inEnd, 
                 unordered_map<int, int>& inMap) {
    if (preStart > preEnd || inStart > inEnd) return nullptr;
    TreeNode* root = new TreeNode(preorder[preStart]);
    int inRoot = inMap[root->val];
    int numsLeft = inRoot - inStart;
    root->left = helper(preorder, preStart+1, preStart+numsLeft, 
                        inorder, inStart, inRoot-1, inMap);
    root->right = helper(preorder, preStart+numsLeft+1, preEnd, 
                         inorder, inRoot+1, inEnd, inMap);
    return root;
}

考试高频题型

  1. 递归应用:如遍历、深度计算、对称判断。
  2. 非递归实现:栈模拟递归过程(前中后序遍历)。
  3. 构造二叉树:根据前序/中序/后序序列重建。
  4. 特殊二叉树:二叉搜索树(BST)、平衡二叉树(AVL)的性质与操作。
  5. 路径问题:如求根到叶子节点的路径和。

掌握上述核心代码和逻辑,可覆盖多数二叉树相关考题。

相关推荐
战族狼魂7 小时前
高频面试题精选:分治与AI Agent架构
人工智能·算法·大模型·大语言模型
weixin_408099677 小时前
2026 图片去水印 API 接口完全指南:一键去除图片水印(附 Python/Java/PHP/C# 示例)
java·python·php·图片处理·api调用·图片去水印·石榴智能
李剑一7 小时前
你用过网易的将军令嘛?它底层实现账号保护的原理相当简单粗暴
算法
Scott9999HH7 小时前
告别流量波动玄学!从法拉第电磁定律到底层 C/C++ 流量累积算法,深度解密工业级电磁流量计选型与开发
c语言·c++·算法
钱六两7 小时前
#3、SpringAI 接入deepSeek大模型(喂饭版)
java·spring boot·ai编程
脱胎换骨-军哥7 小时前
C++/Rust无缝互操作:混合系统新常态
开发语言·c++·rust
香辣牛肉饭8 小时前
【算法】动态规划 最长公共子序列(LCS)
经验分享·笔记·算法·动态规划
null_178 小时前
IntelliJ IDEA 极致流畅配置方案:Ultra 9 285K + 64GB 内存实测
java·ide·intellij-idea
Herbert_hwt9 小时前
建立Java程序开发
java·开发语言
好好沉淀9 小时前
@ExcelIgnoreUnannotated 和 @AutoMapper 详解
java