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

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

  • 相关阅读:
    在c#中使用全局快捷键
    把其他C/C++编译器集成到VC2005中
    零基础学习Oracle 10G视频教程
    异常处理 Exception
    序列化与反序列化 BinaryFormatter二进制(.dat)、SoapFormatter(.soap)、XmlSerializer(.xml)
    MVC 数据验证
    MVC 路由规则
    分部类,分部方法 修饰符partial
    HttpRuntime类
    MVC 模型绑定
  • 原文地址:https://www.cnblogs.com/ariel-dreamland/p/9159797.html
Copyright © 2011-2022 走看看