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

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

  • 相关阅读:
    Notes of Daily Scrum Meeting(12.18)
    Notes of Daily Scrum Meeting(12.17)
    Notes of Daily Scrum Meeting(12.16)
    Notes of Daily Scrum Meeting(12.8)
    Notes of Daily Scrum Meeting(12.5)
    Notes of Daily Scrum Meeting(12.3)
    Notes of Daily Scrum Meeting(11.12)
    Linux中profile、bashrc、bash_profile之间的区别和联系
    Linux GCC编译
    mysql 5.7.16 远程连接
  • 原文地址:https://www.cnblogs.com/ariel-dreamland/p/9159797.html
Copyright © 2011-2022 走看看