Leetcode记录

Map

新建

Map<Integer,Integer> m=new HashMap<>()

插入

m.put(key,v)

查找

if(m.containsKey(key))

层序遍历二叉树(记录高度)

deque <TreeNode*> dq;
dq.push_back(root);
intr h = 0;
//特判root是null,不写了
while(!dq.empty()){
    int layersize = dq.size();//如果无需size的话,直接写循环内部的代码
    for(int i = 0;i<layersize;++i){
        cur = dq.front();
        dq.pop_front();
        /*同时跟着pop进行对当前节点的操作*/
        //todo xxx:比如交换左右节点
        
        if(cur->left!=nullptr) dq.push_back(cur->left);
        if(cur->right!=nullptr) dq.push_back(cur->right);
        
    }
    ++h;//遍历完一层计数
}
return h;

对称二叉树

需要注意递归的时候不仅ab的左右节点需要判,ab本身的val也要相等

迭代法是一次判断一对(ab);一对入4个(a左b右a右b左)

/**
 * Definition for a binary tree node.
 * 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:
    bool isSymmetric(TreeNode* root) {
        // if(root == nullptr) return true;
        // return ismirror(root->left,root->right);
        if(root==nullptr) return true;
        deque<TreeNode*> dq;
        dq.push_back(root->left);
        dq.push_back(root->right);
        while(!dq.empty()){
            TreeNode* a = dq.front();
            dq.pop_front();
            TreeNode* b = dq.front();
            dq.pop_front();
 
            if(a==nullptr && b==nullptr) continue;
            if(a==nullptr || b==nullptr) return false;
            if(a->val!=b->val) return false;
            dq.push_back(a->left);
            dq.push_back(b->right);
            dq.push_back(a->right);
            dq.push_back(b->left);
        }
        return true;
 
    }
    // bool ismirror(TreeNode* a,TreeNode* b){
    //     if(a!=nullptr&&b==nullptr) return false;
    //     if(a==nullptr&&b==nullptr) return true;
    //     if(a==nullptr&&b!=nullptr) return false;
    //     return (ismirror(a->right,b->left) &&ismirror(a->left,b->right) && a->val==b->val);
    // }
};

二叉树展开为链表

class Solution {
public:
    void flatten(TreeNode* root) {
        //两个指针,pre,cur
        //pre用来找cur的左子树的最右,找到后指向cur的right
        //然后cur断开原本right,cur的right更新为cur的left
        //然后cur更新下一个(cur->right)
        TreeNode* cur = root;
        TreeNode* pre;
        while(cur!=nullptr){
            if(cur->left!=nullptr){//判左子树
                pre = cur->left;//开始找左子树最右
                while(pre->right!=nullptr){
                    pre = pre->right;
                }
                if(pre->right!=cur){pre->right = cur->right;}
                cur->right = cur->left;//cur解绑
                cur->left = nullptr;
            }
            cur = cur->right;
        }
    }
};

从前序中序建立二叉树

class Solution {
public:
    map<int,int> hm;
    int preind = 0;
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        int size = inorder.size();
        for(int i = 0;i<size;++i){//建中序哈希表
            // hm.insert(inorder[i],i);//没这个用法
            hm[inorder[i]] = i;
        }
        return build(preorder,0,size);
    }
    TreeNode* build(vector<int>& pre,int l,int r){
        if(l==r) return nullptr;//递归出口
 
        int curval = pre[preind++];
        TreeNode* cur = new TreeNode(curval);
        
        /*进行查哈希表;其实不用这么麻烦*/
        // auto iter = hm.find(curval);
        // int ind = iter->second;
 
        int ind = hm[curval];
 
        cur->left = build(pre,l,ind);
        cur->right = build(pre,ind+1,r);
        return cur;
    }
};

LCA

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        //递归。如果当前节点左右分别有p,q,则当前节点就是p和q的LCA
        //如果一个查到了,另一个没查到,就哪边有战果汇报哪边;向上汇报
        if(root==nullptr || root==p || root==q){
            return root;
        }
        TreeNode* left = lowestCommonAncestor(root->left,p,q);
        TreeNode* right = lowestCommonAncestor(root->right,p,q);
        if(left!=nullptr&&right!=nullptr) return root;
        if(left!=nullptr) return left;///哪边有战果汇报哪边
        if(right!=nullptr) return right;
    }
};