当前位置: 首页 > article >正文

Day6---二叉树基础(上)

二叉树种类

  1. 满二叉树--------特点:深度为K,有2^k-1个节点
  2. 完全二叉树------特点:1.只能是最底层可能没填满;2.只可能是左右都没或者“左在右空”,其余情况都不是
  3. 二叉搜索树-------特点:左子树所有节点值都小于根节点,右子树则都大
  4. 平衡二叉树--------特点:左右子树的高度差不超过1

二叉树的遍历方式

主要可分为:
1.深度优先遍历(DFS)---------一条路走到底再返回:可分为前序、中序和后序
2.广度优先遍历(BFS)------一层一层走完(层次遍历)
###前序遍历

前序遍历—(中左右)

class Solution {
public:
    void traversal(TreeNode* cur, vector<int>& vec) {
        if (cur == NULL) return;
        vec.push_back(cur->val);    // 中
        traversal(cur->left, vec);  // 左
        traversal(cur->right, vec); // 右
    }
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> result;
        traversal(root, result);
        return result;
    }
};

中序遍历—(左中右)

class Solution {
public:
    void traversal(TreeNode* cur, vector<int>& vec) {
    if (cur == NULL) return;
    traversal(cur->left, vec);  // 左
    vec.push_back(cur->val);    // 中
    traversal(cur->right, vec); // 右
}
    vector<int> midorderTraversal(TreeNode* root) {
        vector<int> result;
        traversal(root, result);
        return result;
    }
};

后序遍历—(左右中)

class Solution {
public:
    void traversal(TreeNode* cur, vector<int>& vec) {
    if (cur == NULL) return;
    traversal(cur->left, vec);  // 左
    traversal(cur->right, vec); // 右
    vec.push_back(cur->val);    // 中
}
    vector<int> lastorderTraversal(TreeNode* root) {
        vector<int> result;
        traversal(root, result);
        return result;
    }
};

层次遍历—(利用队列实现)

//层序遍历;需要依赖队列实现
vector<vector<int>> levelOrder(TreeNode* root)
{
    //1.先创建一个队列,存储根节点
    queue<TreeNode*> que;
    if(root!=NULL) que.push(root);
    vector<vector<int>> res;
    //2.while循环,进行树的遍历
    while(!que.empty())
    {
        int size=que.size();
        //3.创建一个容器,存放每一层的结果
        vector<int> vec;//存储每一层的结果
        //4.循环,输出当前一层的结果;并存储下一层 的节点
        for(int i=0;i<size;i++)
        {
            TreeNode *node=que.front();
            que.pop();
            vec.push_back(node->val);
            if(node->left) que.push(node->left);
            if(node->right) que.push(node->right);
        }
        res.push_back(vec);
    }
    return res;
}

http://www.kler.cn/a/38009.html

相关文章:

  • (一)Qt下实现多个海康工业相机内触发采集回调取流显示
  • Spring MVC文件上传
  • 编写Pthreads程序实现直方图统计
  • Java设计模式之创建型-原型模式(UML类图+案例分析)
  • Ansible 自动化运维工具(完善版)
  • 让白嫖来的阿里云服务器来跑jupyter
  • Flutter ValueNotifier 监听数据变化
  • 论文阅读 HighlightMe: Detecting Highlights from Human-Centric Videos
  • wordpress仿站常用功能代码
  • HarmonyOS/OpenHarmony应用开发-Stage模型UIAbility组件使用(四)
  • Java Vue物联网系统
  • vagrant和vitrulBox创建虚拟机后使用xshell连接
  • Android 中利用多个Button组合实现选项切换效果
  • layui入门
  • AI辅助瞄准系统开发与实战(二)
  • 二级分销小程序怎么做
  • 【自我提升】JPA从搭建到CRUD快速入门(IDEA+MAVEN)
  • 【Linux系列P6】自动化构建工具-make/Makefile详解
  • 【跨平台开发】Uni-app原理分析
  • 安全启动相关命令使用