代码随想录算法训练营第15天|● 层序遍历 10 ● 226.翻转二叉树 ● 101.对称二叉树

层序遍历

思路:利用一个辅助队列存放每一层的元素,出队的同时再把其孩子节点存入队列。队列为空则遍历结束。

代码:

vector<vector<int>> levelOrder(TreeNode* root) {
        queue<TreeNode*> que;
        if(root!=nullptr)   que.push(root);
        vector<vector<int>> result;
        while(!que.empty()){
            vector<int> vec;
            int size = que.size();//该层元素固定,用size存放,否则que.size会变动
            for(int i =0;i < size;i++){
                TreeNode* node = que.front();
                vec.push_back(node->val);
                que.pop();
                if(node->left)  que.push(node->left);
                if(node->right) que.push(node->right);
            }
            result.push_back(vec);//存放每一层的元素
        }
        return result;
    }

226.翻转二叉树(递归法)

思路:前后序遍历都可以实现,只需要把二叉树遍历访问根节点时,把左右孩子交换。

前序代码:(后序调换顺序)

TreeNode* invertTree(TreeNode* root) {
        if(root == nullptr) return root;
        swap(root->right,root->left);//中
        invertTree(root->left);//左
        invertTree(root->right);//右
        return root;
    }

若使用中序遍历则会麻烦一点,因为中序遍历处理完左子树,把左子树交换到右边,但此时需要处理右子树,而此时的右子树不是原本的右子树,而是处理完左子树被交换到右边的子树.总之会使左子树处理了两次。所以只需要把代码都处理左子树即可。(因为调换后,要处理的右子树实际是在左边)

正常中序处理会导致重复处理一颗子树

中序代码:

TreeNode* invertTree(TreeNode* root) {
        if(root == nullptr) return root;
        invertTree(root->left);//左
        swap(root->left,root->right);//中
        invertTree(root->left);//右,实际是交换后的右子树
        return root;
    }

  101.对称二叉树

s思路:比较左右两边是否数值对称,可以利用后序遍历,左子树用左右中,右子树右左中。左子树的左孩子与右子树的右孩子比较(外侧),左子树的右孩子与右子树的左孩子作比较(内侧)。最后再返回其比较结果(根处理).因此把根处理放在最后才能返回其左右子树的比较结果。

代码:

bool compare(TreeNode* left,TreeNode* right){
        if(left == nullptr && right != nullptr) return false;
        else if(left != nullptr && right == nullptr) return false;
        else if(left == nullptr && right == nullptr) return true;
        else if(left->val != right->val) return false;
        //排除了以上情况,下面就是左右节点不为空且值相同
         bool outside = compare(left->left,right->right);//外侧,左子树的左边,右子树的右边作比较
         bool inside = compare(left->right,right->left);//内侧,左子树右边,右子树左边作比较
         return outside && inside;
    }
    bool isSymmetric(TreeNode* root) {
        if(root == nullptr) return true;
        return compare(root->left,root->right);
    }

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值