代码随想录算法训练营第十五天|102.层序遍历,226.翻转二叉树,101.对称二叉树

102.层序遍历

题目链接

思路:层序遍历,就是图论中的广度优先遍历,只不过我们应用在二叉树上。我们需要借助一个辅助数据结构即队列来实现,队列先进先出,符合一层一层遍历的逻辑,而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。

class Solution {
public:
    vector> levelOrder(TreeNode* root) {
        queue que;
        vector> result;
        if(root) que.push(root);
        while(!que.empty()){
            int size=que.size();
            vector vec;
            while(size--){
                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);
            }
            result.push_back(vec);
        }
        return result;
    }
};

226.翻转二叉树

题目链接

思路:首先确定我们应该用哪种遍历方式,有两大类遍历方式,递归和非递归,递归里又有前中后序。本题用前序遍历和后序遍历比较合适。我们交换的是指针,不是数值。

前序遍历:

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

后序遍历:

class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {//确定函数的返回值和参数
        //确定终止条件
        if(root==NULL) return root;
        //确定单层递归的逻辑
        invertTree(root->left);
        invertTree(root->right);
        swap(root->left,root->right);
        return root;
    }
};

注意,最后还是返回root,进入递归函数后root就不是真正的root了,相当于在主函数里,root没有改变过,所以最后还可以返回root。

101.对称二叉树

题目链接

思路:

1、确定递归函数的参数和返回值:我们要比较的是根节点的两颗子树是否可以相互反转,进而判断这棵树是不是对称树,所以要比较的是两棵树,参数自然也是左子树节点和右子树节点。

根据题目描述,返回值应该是bool类型。

2、确定终止条件,左空右不空,左不空右空,左右值不相等都停止递归向上返回false,左空右空也停止递归,但返回true。剩下的就是左右不为空,且数值相等的情况。

3、单层递归的逻辑:就是处理左右不为空,数值相等的情况。

比较二叉树外侧是否对称,传入左节点的左孩子,右节点的右孩子。

比较二叉树内侧是否对称,传入左节点的右孩子,右孩子的左孩子。

如果外侧和内侧都对称就返回true,否则返回false。

class Solution {
public:
    bool compare(TreeNode* left,TreeNode* right){//确定递归函数参数和返回值
        //确定终止条件
        if(left!=NULL&&right==NULL) return false;
        else if(left==NULL&&right!=NULL) return false;
        else if(left==NULL&&right==NULL) return true;
        else if(left->val!=right->val) return false;//节点为空都已经判断完了,不用担心操作空指针//这里很巧妙,左右都为空,也是终止条件,但返回true
        //刚刚没有用else,而是用else if,因为我们把以上情况都排除以后剩下的就是左右节点都不为空,且数值相同的情况
        //进入单层递归的逻辑
        bool outside=compare(left->left,right->right);//比较外侧
        bool inside=compare(left->right,right->left);//比较内侧
        bool result=outside&&inside;
        return result;
    }
    bool isSymmetric(TreeNode* root) {
        if(root==nullptr) return true;
        return compare(root->left,root->right);
    }
};

你可能感兴趣的:(算法,数据结构,leetcode)