当前位置:   article > 正文

[C/C++] -- 二叉树_满二叉树c++

满二叉树c++

1.简介

二叉树是一种每个节点最多有两个子节点的树结构,通常包括:根节点、左子树、右子树。

  • 满二叉树:

如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。深度为k,有2^k - 1个节点。

  • 完全二叉树

除了最底层节点可能没填满外,其余每层节点数都达到最大值,且最下面一层节点都集中在该层最左边若干位置。若最底层为k层,则该层包含1~2^(k-1)个节点。

优先级队列其实是一个堆,堆就是一棵完全二叉树,同时保证父子节点的顺序关系。

  • 二叉搜索树

二叉搜索树有数值,是一个有序树。

若左子树不空,则左子树上所有节点值均小于根节点值。

若右子树不空,则右子树上所有节点值均大于根节点值。

左右子树分别为二叉搜索树

  • 平衡二叉搜索树

任意节点的左子树和右子树高度差不超过1,空树仅有一个节点,也是一种平衡二叉搜索树

C++种map、set、multimap、multiset的底层实现是平衡二叉搜索树(红黑树),所以增删时间复杂度O(logn),unordered_map、unordered_set底层实现是哈希表,理想情况具有O(1)的增删时间复杂度,最坏情况O(n)。

  • 二叉树存储方式

链式存储(指针)、顺序存储(数组)

二叉树定义:

  1. #include <iostream>
  2. // 定义二叉树节点结构
  3. struct TreeNode {
  4. int val;
  5. TreeNode* left;
  6. TreeNode* right;
  7. TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
  8. };
  9. int main() {
  10. // 创建二叉树节点
  11. TreeNode* root = new TreeNode(1);
  12. root->left = new TreeNode(2);
  13. root->right = new TreeNode(3);
  14. root->left->left = new TreeNode(4);
  15. root->left->right = new TreeNode(5);
  16. // 访问二叉树节点的数值
  17. std::cout << "The value of the root node is: " << root->val << std::endl;
  18. std::cout << "The value of the left child of the root is: " << root->left->val << std::endl;
  19. // 释放二叉树节点的内存
  20. delete root->left->left;
  21. delete root->left->right;
  22. delete root->left;
  23. delete root->right;
  24. delete root;
  25. return 0;
  26. }

2.二叉树遍历

常用于图论:

深度优先遍历:先往深走、遇到叶子节点再往回走。(前序、中序、后续遍历:递归法、迭代法)

广度优先遍历:一层一层的去遍历。(层次遍历:迭代法)

前中后指的是中间节点遍历顺序

前序:中左右          5 4 1 2 6 7 8

中序:左中右          1 4 2 5 7 6 8

后序:左右中          1 2 4 7 8 6 5

递归法: 

 前序遍历:

  1. class Solution {
  2. public:
  3. void traversal(TreeNode* cur, vector<int>& vec) {
  4. if (cur == NULL) return;
  5. vec.push_back(cur->val);
  6. traversal(cur->left,vec);
  7. traversal(cur->right,vec);
  8. }
  9. vector<int> preorderTraversal(TreeNode* root) {
  10. vector<int> result;
  11. traversal(root, result);
  12. return result;
  13. }
  14. };

中序遍历:

  1. class Solution {
  2. public:
  3. void traversal(TreeNode* cur, vector<int>& vec) {
  4. if (cur == NULL) return;
  5. traversal(cur->left,vec);
  6. vec.push_back(cur->val);
  7. traversal(cur->right,vec);
  8. }
  9. vector<int> preorderTraversal(TreeNode* root) {
  10. vector<int> result;
  11. traversal(root, result);
  12. return result;
  13. }
  14. };

后序遍历:

  1. class Solution {
  2. public:
  3. void traversal(TreeNode* cur, vector<int>& vec) {
  4. if (cur == NULL) return;
  5. traversal(cur->left,vec);
  6. traversal(cur->right,vec);
  7. vec.push_back(cur->val);
  8. }
  9. vector<int> preorderTraversal(TreeNode* root) {
  10. vector<int> result;
  11. traversal(root, result);
  12. return result;
  13. }
  14. };

迭代法:

前序遍历

  1. class Solution {
  2. public:
  3. vector<int> preorderTraversal(TreeNode* root) {
  4. stack<TreeNode*> st;
  5. vector<int> result;
  6. st.push(root);
  7. while (!st.empty()){
  8. TreeNode* node = st.top();
  9. st.pop();
  10. result.push_back(node->val);
  11. if (node->right) st.push(node->right);
  12. if (node->left) st.push(node->left);
  13. }
  14. return result;
  15. }
  16. };

中序遍历

  1. class Solution {
  2. public:
  3. vector<int> preorderTraversal(TreeNode* root) {
  4. stack<TreeNode*> st;
  5. vector<int> result;
  6. TreeNode* cur = root;
  7. while (cur != NULL || !st.empty()){
  8. if (cur != NULL){
  9. st.push(cur);
  10. cur = cur->left;
  11. }else{
  12. cur = st.top();
  13. st.pop();
  14. result.push_back(cur->val);
  15. cur = cur->right;
  16. }
  17. }
  18. return result;
  19. }
  20. };

后序遍历

  1. class Solution {
  2. public:
  3. vector<int> preorderTraversal(TreeNode* root) {
  4. stack<TreeNode*> st;
  5. vector<int> result;
  6. if (root == NULL) return result;
  7. st.push(root);
  8. while (!st.empty()){
  9. TreeNode* node = st.top();
  10. st.pop();
  11. result.push_back(node->val);
  12. if (node->left) st.push(node->left);
  13. if (node->right) st.push(node->right);
  14. }
  15. reverse(result.begin(),result. End());
  16. return result;
  17. }
  18. };

3.例题

示例 1:

输入:root = [1,7,0,7,-8,null,null]
输出:2
解释:
第 1 层各元素之和为 1,
第 2 层各元素之和为 7 + 0 = 7,
第 3 层各元素之和为 7 + -8 = -1,
所以我们返回第 2 层的层号,它的层内元素之和最大。

示例 2:

输入:root = [989,null,10250,98693,-89388,null,null,null,-32127]
输出:2
  • 深度优先搜索 

  1. /**
  2. * Definition for a binary tree node.
  3. * struct TreeNode {
  4. * int val;
  5. * TreeNode *left;
  6. * TreeNode *right;
  7. * TreeNode() : val(0), left(nullptr), right(nullptr) {}
  8. * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
  9. * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
  10. * };
  11. */
  12. class Solution {
  13. vector<int> sum;
  14. void dfs(TreeNode* node,int level){
  15. if(sum.size() == level){
  16. sum.push_back(node->val);
  17. }else{
  18. sum[level]+=node->val;
  19. }
  20. if(node->left){
  21. dfs(node->left,level+1);
  22. }
  23. if(node->right){
  24. dfs(node->right,level+1);
  25. }
  26. }
  27. public:
  28. int maxLevelSum(TreeNode* root) {
  29. dfs(root,0);
  30. int ans = 0;
  31. for(int i = 0;i<sum.size();i++){
  32. if(sum[i]>sum[ans]){
  33. ans = i;
  34. }
  35. }
  36. return ans+1;
  37. }
  38. };
  • 广度优先搜索
  1. /**
  2. * Definition for a binary tree node.
  3. * struct TreeNode {
  4. * int val;
  5. * TreeNode *left;
  6. * TreeNode *right;
  7. * TreeNode() : val(0), left(nullptr), right(nullptr) {}
  8. * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
  9. * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
  10. * };
  11. */
  12. class Solution {
  13. public:
  14. int maxLevelSum(TreeNode* root) {
  15. int ans = 1,maxSum = root->val;
  16. vector<TreeNode*q> = {root};
  17. for(int level = 1;!q.empty();++level){
  18. vector<TreeNode*> nq;
  19. int sum = 0;
  20. for (auto node:q) {
  21. sum +=node->val;
  22. if (node->left){
  23. //用于在容器尾部直接构造一个新元素,可以避免额外的拷贝或移动操作。
  24. nq.emplace_back(node->left);
  25. }
  26. if(node->right){
  27. nq.emplace_back(node->right);
  28. }
  29. }
  30. if (sum > maxSum) {
  31. maxSum = sum;
  32. ans = level;
  33. }
  34. //通过 move(nq),我们将 nq 的所有权(ownership)转移给 q。
  35. //这意味着实际上并不会进行元素的复制,而是直接将 nq 中的元素转移到 q 中,同时 nq 被置为空。
  36. q = move(nq);
  37. }
  38. return ans;
  39. }
  40. };
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/621988
推荐阅读
相关标签
  

闽ICP备14008679号