1.16 - 二叉树的中序遍历 && 动态多态的实现原理

目录

1.二叉树的中序遍历

a.核心思想

b.思路

c.步骤

2.动态多态的实现原理

a.核心思想

b.实现逻辑

c.示例逻辑


1.二叉树的中序遍历

94. 二叉树的中序遍历 - 力扣(LeetCode)https://leetcode.cn/problems/binary-tree-inorder-traversal/

cpp 复制代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left),
 * right(right) {}
 * };
 */
class Solution {
public:
    void inorder(TreeNode* root, std::vector<int>& res) {
        if (root == nullptr)
            return;
        inorder(root->left, res);
        res.push_back(root->val);
        inorder(root->right, res);
    }

    std::vector<int> inorderTraversal(TreeNode* root) {
        vector<int> res;
        inorder(root, res);
        return res;
    }
};

a.核心思想

利用二叉树中序遍历的规则(左子树 -> 根节点 -> 右子树),通过递归的方式依次访问二叉树的节点,将访问到的节点值按顺序存储到结果数组中。

b.思路

定义一个递归函数,该函数接收当前节点和一个用于存储结果的引用数组作为参数。在递归函数中,首先判断当前节点是否为空,若为空则直接返回;否则,先递归遍历左子树,然后将当前节点的值加入结果数组,最后递归遍历右子树。

c.步骤

① 定义递归函数 inorder,参数为当前节点 root 和结果数组的引用 res

② 在 inorder 函数中,若 root 为空,返回。

③ 递归调用 inorder 遍历左子树。

④ 将 root 的值加入 res

⑤ 递归调用 inorder 遍历右子树。

⑥ 在主函数中,初始化结果数组,调用 inorder 函数,返回结果数组。

2.动态多态的实现原理

a.核心思想

动态多态通过虚函数表(vtable)+ 虚指针(vptr) 实现运行时绑定,根据对象实际类型调用对应函数。

b.实现逻辑

① 虚函数表( vtable **):**编译器为每个含虚函数的类生成一张表,存储该类所有虚函数的实际地址(派生类覆盖基类虚函数时更新表项)。

**② 虚指针(vptr):**对象内存首地址存放指向自身类vtable的指针(由构造函数初始化)。

**③ 动态绑定:**通过基类指针/引用调用虚函数时,通过vptr定位vtable,根据函数偏移量跳转到实际函数执行(非静态绑定)。

c.示例逻辑

cpp 复制代码
class Base {
public:
    virtual void func() { /*...*/ } // 基类虚函数
};

class Derived : public Base {
public:
    void func() override { /*...*/ } // 覆盖基类虚函数
};

int main() 
{
    Base* obj = new Derived();
    obj->func(); // 运行时调用Derived::func()
    
    return 0;
}

关键:obj->func() 通过obj的vptr找到Derived的vtable,执行第0项(func对应位置)的实际函数。

希望这些内容对大家有所帮助!

感谢大家的三连支持!

相关推荐
白昼流星!3 小时前
顺序表与单链表的数据存储差异: 为何顺序表元素用指针,链表节点数据不用?
数据结构·链表·顺序表
扶摇接北海1763 小时前
洛谷:P1104 生日
算法
汉克老师3 小时前
GESP5级C++考试语法知识(七、链表(二)双链表)
c++·链表·双链表·gesp5级·gesp五级
旖-旎3 小时前
二分查找(寻找旋转排序数组中的最小值)(7)
c++·算法·二分查找·力扣
C羊驼3 小时前
C/C++数据结构与算法:穷举法
c语言·c++·笔记·学习·算法
guoji77883 小时前
Gemini 3.1 Pro 安全与对齐机制深度解析:可控性、合规性与企业级应用评估
大数据·人工智能·算法
小则又沐风a3 小时前
[蓝桥杯 2014 省 AB] 蚂蚁感冒
算法·职场和发展·蓝桥杯
十五年专注C++开发3 小时前
libuv:一个跨平台的C++异步 I/O 库
开发语言·c++·node.js·libuv·vlibuv
IT猿手4 小时前
基于强化学习Q-learning算法的无人机三维路径规划算法原理与实现,MATLAB代码
算法·matlab·无人机·路径规划·动态路径规划
qq_417695054 小时前
C++中的解释器模式
开发语言·c++·算法