(十三)树【C++刷题】

二叉树的层序遍历

Leetcode:102,https://leetcode-cn.com/problems/binary-tree-level-order-traversal/

1.问题描述

给定一个二叉树,返回按层序遍历得到的节点值。(即逐层的,从左到右访问所有节点)。

2.输入输出

  • Input:[3, 9, 20, null, null, 15, 7]
  • Output:[[3], [9, 20], [15, 7]]

3.算法分析

利用队列先进先出的特性完成,期间通过一个size来记录每层的节点数,从而判断出一层。

  • 时间复杂度:O(N)
  • 空间复杂度:O(N)

4.编程实现

#include <iostream>
#include <vector>
#include <stack>
using namespace std;

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:
	vector<vector<int>> levelOrder(TreeNode *root) {
        vector<vector<int>> level;
        if (!root) return level;
        queue<TreeNode *> que;
        que.push(root);

        while (!que.empty()) {
            vector<int> tmp;
            int len = que.size();
            for (int i = 0; i < len; i++){
            	TreeNode *node = que.front();
            	que.pop();
            	tmp.push_back(node->val);
            	if (node->left) que.push(node->left);
            	if (node->right) que.push(node->right);
            }
            level.push_back(tmp);
        }
        
        return level;
	}
};

int main() {
    TreeNode *root = new TreeNode(1);
    root->right = new TreeNode(2);
    root->right->left = new TreeNode(3);
    
    Solution sol;
    for (auto val: sol.levelOrder(root))  {
        cout << val << " ";
    }
    
    return 0;
}

二叉树的锯齿形层序遍历

Leetcode:https://leetcode-cn.com/problems/binary-tree-zigzag-level-order-traversal/

1.问题描述

给定一个二叉树,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。

2.输入输出

  • Input:[3,9,20,null,null,15,7]
  • Output:[[3],[20,9],[15,7]]

3.算法分析

采用队列,层序遍历,记录每一层大小后直接在对应索引处赋值

4.编程实现

#include <iostream>
#include <queue>
#include <vector>
using namespace std;

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) {}
};

class Solution {
public:
    vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
        vector<vector<int>> res;
        queue<TreeNode *> q;
        if (root) q.push(root);
        
        bool lr = true;
        while (!q.empty()) {
            int size = q.size();
            vector<int> level(size, 0);
            while (size--) {
                root = q.front();
                q.pop();
                level[lr ? level.size() - size - 1 : size] = root->val;
                if (root->left) q.push(root->left);
                if (root->right) q.push(root->right);
            }
            res.push_back(move(level));
            lr = !lr;
        }
        
        return res;
    }
};

int main() {
    int val;
    Solution sol;
    TreeNode *root = new TreeNode(3);
    root->left = new TreeNode(9);
    root->right = new TreeNode(20);
    root->right->left = new TreeNode(15);
    root->right->right = new TreeNode(7);
    
    cout << sol.zigzagLevelOrder(root)[1][1] << endl;
}

include

include

include

using namespace std;

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:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if (root == q || root == p || root == NULL) return root;
TreeNode* left = lowestCommonAncestor(root->left, p, q);
TreeNode* right = lowestCommonAncestor(root->right, p, q);
if (left != NULL && right != NULL) return root;
if (left == NULL) return right;
return left;
}
};

int main() {
TreeNode *root = new TreeNode(3);
root->left = new TreeNode(5);
root->right = new TreeNode(1);
root->left->left = new TreeNode(6);
root->left->right = new TreeNode(2);
root->right->left = new TreeNode(0);
root->right->right = new TreeNode(8);
root->left->right->left = new TreeNode(7);
root->left->right->right = new TreeNode(4);
TreeNode *p = root->left;
TreeNode *q = root->right;
TreeNode *k = root->left->right->right;

Solution sol;
TreeNode *res = sol.lowestCommonAncestor(root, p, q);
cout << res->val << endl;
res = sol.lowestCommonAncestor(root, p, k);
cout << res->val << endl;
return 0;

}

posted @ 2021-12-27 12:29  Caoer199  阅读(50)  评论(0编辑  收藏  举报