zoukankan      html  css  js  c++  java
  • LeetCode(100):相同的树

    Easy!

    题目描述:

    给定两个二叉树,编写一个函数来检验它们是否相同。

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

    示例 1:

    输入:       1         1
              /        / 
             2   3     2   3
    
            [1,2,3],   [1,2,3]
    
    输出: true

    示例 2:

    输入:      1          1
              /           
             2             2
    
            [1,2],     [1,null,2]
    
    输出: false
    

    示例 3:

    输入:       1         1
              /        / 
             2   1     1   2
    
            [1,2,1],   [1,1,2]
    
    输出: false

    解题思路:

    判断两棵树是否相同和之前的判断两棵树是否对称都是一样的原理,利用深度优先搜索DFS递归

    C++解法一:

    1 class Solution {
    2 public:
    3     bool isSameTree(TreeNode *p, TreeNode *q) {
    4         if (!p && !q) return true;
    5         if ((p && !q) || (!p && q) || (p->val != q->val)) return false;
    6         return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
    7     }
    8 };

    这道题还有非递归的解法,因为二叉树的四种遍历(层序,先序,中序,后序)均有各自的迭代和递归的写法,这里我们先来看先序的迭代写法,相当于同时遍历两个数,然后每个节点都进行比较。

    C++解法二:

     1 class Solution {
     2 public:
     3     bool isSameTree(TreeNode* p, TreeNode* q) {
     4         stack<TreeNode*> s1, s2;
     5         if (p) s1.push(p);
     6         if (q) s2.push(q);
     7         while (!s1.empty() && !s2.empty()) {
     8             TreeNode *t1 = s1.top(); s1.pop();
     9             TreeNode *t2 = s2.top(); s2.pop();
    10             if (t1->val != t2->val) return false;
    11             if (t1->left) s1.push(t1->left);
    12             if (t2->left) s2.push(t2->left);
    13             if (s1.size() != s2.size()) return false;
    14             if (t1->right) s1.push(t1->right);
    15             if (t2->right) s2.push(t2->right);
    16             if (s1.size() != s2.size()) return false;
    17         }
    18         return s1.size() == s2.size();
    19     }
    20 };

    其他几种遍历顺序的迭代写法应该也可同理实现。

  • 相关阅读:
    使用paramikoHelper类实现MySQL安装和数据恢复
    tornado-模板,转义,上传静态文件
    tornado-请求与响应
    tornado-输入
    tornado-输出,request
    配置Ubuntu虚拟环境
    tornado-简单的服务器非阻塞
    Linux查看进程,端口,访问url
    tornado-简单的服务器
    字符串,数组,定时器,form
  • 原文地址:https://www.cnblogs.com/ariel-dreamland/p/9159797.html
Copyright © 2011-2022 走看看