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);
            }
        }
    };
    
posted @ 2021-08-25 15:36  Drophair  阅读(28)  评论(0编辑  收藏  举报