LeetCode | C++ 102.二叉树的层序遍历、226.翻转二叉树、101.对称二叉树

52 篇文章 0 订阅

102.二叉树的层序遍历

思路:使用队列

先把根节点放到队列里面,然后记录队列的大小,这里记录的大小实际上是每一层节点的个数,后面还需要通过该大小,将该层的节点进行弹出,在弹出的时候,将弹出节点的值存到 resultSmall 里面,然后判断该节点的左右孩子是否为空,不为空,继续加到队列里面,等一层的遍历结束,将resultSmall 存到result里面。

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        queue<TreeNode*> queue1;
        vector<vector<int>> result;
        if (root != NULL) {
            queue1.push(root);
        } else return result;
           
        while (!queue1.empty()) {
            TreeNode* node;
            int size;
            size = queue1.size();
            vector<int> resultSmall;
            while (size--) {
                node = queue1.front();
                queue1.pop();
                resultSmall.push_back(node->val);
                if (node->left) {
                    queue1.push(node->left);
                }
                if (node->right) {
                    queue1.push(node->right);
                }
            }
            result.push_back(resultSmall);
        }
        return result;
    }
};

226.翻转二叉树

相当于把二叉树沿着 x = 0 对称轴进行翻转过来

该题目用递归的前序和后序是最合适的。

对于前序:中左右,先交换左右孩子节点,然后反转左子树,再反转右子树

class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        if (root == NULL) return root;
        swap(root->left, root->right);
        invertTree(root->left);
        invertTree(root->right);
        return root; 
    }
};

101.对称二叉树

这道题目只能使用后序遍历:左右中
什么情况下只能使用后序遍历:就是当需 要收集孩子的信息,向上一层返回,这道题目实际上是考察同时处理两个二叉树的遍历过程,同时比较两个二叉树里面对应的节点的情况。

当根节点的左右节点的值相等时,才会去比较左右节点的左右孩子,是否相等,若左节点->左孩子 与 右节点->右孩子相等, 左节点->右孩子 与 右节点->左孩子相等,则左右节点 此时称之为真正的相等。这样就可以和左右中的顺序对应起来。

class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        if (root == NULL) return true;
        return compare(root->left, root->right);
    }
    bool compare(TreeNode* left, TreeNode* right) {
        if (left == NULL && right != NULL) return false;
        if (left != NULL && right == NULL) return false;
        if (left == NULL && right == NULL) return true;
        if ( left->val != right->val) return false;

        bool outside = compare(left->left, right->right);
        bool inside = compare(left->right, right->left);
        bool isSame = outside && inside;
        return isSame;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值