打卡leetcode第19天

目录

1.删除排序链表中的重复元素

2.二叉树的中序遍历

3. 相同的树

4.字符串相乘


1.删除排序链表中的重复元素

【题目】

【分析】

一次遍历

struct ListNode* deleteDuplicates(struct ListNode* head) {
    if (!head) {
        return head;
    }

    struct ListNode* cur = head;
    while (cur->next) {
        if (cur->val == cur->next->val) {
            cur->next = cur->next->next;
        }else{
            cur = cur->next;
        }
    }

    return head;
}

2.二叉树的中序遍历

【题目】给定一个二叉树的根节点 root ,返回它的 中序 遍历。

【分析】

法1:递归

void Traversal(struct TreeNode* root,int *returnNum,int* returnSize )
{
    if(root==NULL)
    {
        return; 
    }
    //左
    Traversal(root->left,returnNum,returnSize);

    //根
    returnNum[*returnSize]   = root->val;       
    *returnSize = *returnSize + 1;//这里不能写++,会发生错误

    //右
    Traversal(root->right,returnNum,returnSize);
}

int* inorderTraversal(struct TreeNode* root, int* returnSize)
{
    //树中节点数目在范围 [0, 100] 内
    int *returnNum = (int *)malloc(sizeof(int)*101);
    *returnSize = 0;
    if(root == NULL)
    {
        return NULL;
    }
    Traversal(root,returnNum,returnSize);
    return returnNum;
}

法2:迭代(栈)

int* inorderTraversal(struct TreeNode* root, int* returnSize)
{
    //树中节点数目在范围 [0, 100] 内
    *returnSize = 0;
    int* returnNum = (int*)malloc(sizeof(int) * 101);
    if (root == NULL)
    {
        return returnNum;
    }

    struct TreeNode* stack[101];
    struct TreeNode* nodeIt;
    int               top = 0;
    nodeIt = root;
    //中序遍历左根右
    while (top > 0 || nodeIt != NULL)
    {
        while (nodeIt != NULL)
        {
            //判断根左右结点关系
            stack[top++] = nodeIt;
            nodeIt = nodeIt->left;
        }
        nodeIt = stack[--top];
        returnNum[*returnSize] = nodeIt->val;
        *returnSize = *returnSize + 1;
        nodeIt = nodeIt->right;
    }
    return returnNum;
}

3. 相同的树

【题目】

给你两棵二叉树的根节点 pq ,编写一个函数来检验这两棵树是否相同。

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

 

【分析】

法1:先序遍历

bool Traversal(struct TreeNode* p,struct TreeNode* q){
    if(p==NULL&&q==NULL){
        return true;
    }
    if(p==NULL||q==NULL){
        return false;
    }
    if(p->val!=q->val){
        return false;
    }
    if(Traversal(p->left,q->left)==false){
        return false;
    }
    if(Traversal(p->right,q->right)==false){
        return false;
    }
    return true;
}

bool isSameTree(struct TreeNode* p, struct TreeNode* q){
    
    bool isSame=true;
    isSame=Traversal(p,q);
    return isSame;
}

法2:递归

bool isSameTree(struct TreeNode* p, struct TreeNode* q){
    if(!p && !q)
        return true;
    if(!p || !q)
        return false;
    if(p->val == q->val)
        return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
    else
        return false;

}

4.字符串相乘

 【分析】

class Solution {
public:
    string multiply(string num1, string num2) {
        vector<int> A, B;
        int n = num1.size(), m = num2.size();
        for (int i = n - 1; i >= 0; i -- ) A.push_back(num1[i] - '0'); //反向存贮
        for (int i = m - 1; i >= 0; i -- ) B.push_back(num2[i] - '0');
        vector<int> C(n + m);
        for (int i = 0; i < n; i ++ )
            for (int j = 0; j < m; j ++ )
                C[i + j] += A[i] * B[j];
        int t = 0;  //存贮进位
        for (int i = 0; i < C.size(); i ++ ) {
            t += C[i];
            C[i] = t % 10;
            t /= 10;
        }
        int k = C.size() - 1;
        while (k > 0 && !C[k]) k -- ;  //去除前导0
        string res;
        while (k >= 0) res += C[k -- ] + '0';  //反转
        return res;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值