LeetCode 100. 相同的树

100. 相同的树

  • 题目要求
    给出两二叉树,询问这两棵树是否完全相同,输出true或者false

  • 题目思路(我的,不知道是否可行,目前仍然是wa,QAQ,成功实现,通过两次不同(DFS)遍历的方式[其中必须包含中序遍历],来确定一棵树,保证其的唯一性)

    • 先知条件:如果已知先序遍历((DLR))和中序遍历((LDR))或者后序遍历((LRD))和中序遍历((LDR))

    • 那么我通过(4)(DFS)深度遍历两棵树(TreeNode) (p),(TreeNode) (q)
      分别得到相应的中序遍历和先(后)序遍历,最后再两个(for)循环进行遍历判断是否相同

    • 代码如下(未实现)

      class Solution {
      public:
          vector<int> lrp[2],lpr[2];
          void init(){
              for(int i=0;i<2;i++){
                  lrp[i].clear();
                  lpr[i].clear();
              }
          }
          void dfs_lrp1(TreeNode* root){
              if(!root)return;
              dfs_lrp1(root->left);
              dfs_lrp1(root->right);
              lrp[0].push_back(root->val);
          }
          void dfs_lrp2(TreeNode* root){
              if(!root)return;
              dfs_lrp2(root->left);
              dfs_lrp2(root->right);
              lrp[1].push_back(root->val);
          }
          void dfs_lpr1(TreeNode* root){
              if(!root)return;
              dfs_lpr1(root->left);
              lpr[0].push_back(root->val);
              dfs_lpr1(root->right);
          }
          void dfs_lpr2(TreeNode* root){
              if(!root)return;
              dfs_lpr2(root->left);
              lpr[1].push_back(root->val);
              dfs_lpr2(root->right);
          }
          bool isSameTree(TreeNode* p, TreeNode* q) {
              init();
              dfs_lrp1(p);
              dfs_lpr1(p);
              dfs_lpr2(q);
              dfs_lrp2(q);
              int f,ff;
              f=ff=1;
              if(lrp[0].size()==lrp[1].size()&&lpr[0].size()==lpr[1].size()){
                  for(int i=0;i<lrp[0].size();i++){
                  if(lrp[0][i]!=lrp[1][i]){
                      f=0;
                      break;
                      }
                  }
                  for(int i=0;i<lpr[0].size();i++){
                      if(lpr[0][i]!=lpr[1][i]){
                          ff=0;
                          break;
                      }
                  }
              }
              else{
                  f=0;
              }
              if(f&&ff){
                  return true;
              }
              return false;
          }};
      
    • 按照自己的思路,再次实现(AC)

      class Solution {
      public:
          vector<int> lrp[2],lpr[2];
          void init(){
              for(int i=0;i<2;i++){
                  lrp[i].clear();
                  lpr[i].clear();
              }
          }
          void dfs_lrp1(TreeNode* root){
              if(!root){lrp[0].push_back(-1);return;}
              dfs_lrp1(root->left);
              dfs_lrp1(root->right);
              lrp[0].push_back(root->val);
          }
          void dfs_lrp2(TreeNode* root){
              if(!root){lrp[1].push_back(-1);return;}
              dfs_lrp2(root->left);
              dfs_lrp2(root->right);
              lrp[1].push_back(root->val);
          }
          void dfs_lpr1(TreeNode* root){
              if(!root){lpr[0].push_back(-1);return;}
              dfs_lpr1(root->left);
              lpr[0].push_back(root->val);
              dfs_lpr1(root->right);
          }
          void dfs_lpr2(TreeNode* root){
              if(!root){lpr[1].push_back(-1);return;}
              dfs_lpr2(root->left);
              lpr[1].push_back(root->val);
              dfs_lpr2(root->right);
          }
          bool isSameTree(TreeNode* p, TreeNode* q) {
              init();
              dfs_lrp1(p);
              dfs_lpr1(p);
              dfs_lpr2(q);
              dfs_lrp2(q);
              int f,ff;
              f=ff=1;
              if(lrp[0].size()==lrp[1].size()&&lpr[0].size()==lpr[1].size()){
                  for(int i=0;i<lrp[0].size();i++){
                  if(lrp[0][i]!=lrp[1][i]){
                      f=0;
                      break;
                      }
                  }
                  for(int i=0;i<lpr[0].size();i++){
                      if(lpr[0][i]!=lpr[1][i]){
                          ff=0;
                          break;
                      }
                  }
              }
              else{
                  f=0;
              }
              if(f&&ff){
                  return true;
              }
              return false;
          }};
      
  • 正解

    class Solution {
    public:
        bool isSameTree(TreeNode* p, TreeNode* q) {
            if(p==nullptr&&q==nullptr){// 两棵空树
                return true;
            }
            else if(p==nullptr||q==nullptr){// 只有一棵树是空的
                return false;
            }
            else if(p->val!=q->val){// 节点值不同
                return false;
            }
            else{// 继续遍历
                return isSameTree(p->left,q->left)&&isSameTree(p->right,q->right);
            }
        }
    };
    
作者:Drophair
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
原文地址:https://www.cnblogs.com/jackwang-sparrow/p/15185310.html