zoukankan      html  css  js  c++  java
  • 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
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    ASP.NET -- repeater控件的使用
    在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。 (provider: 命名管道提供程序, error: 40
    错误提示:在此上下文中不允许使用名称 "***"。有效表达式包括常量、 常量表达式和变量(在某些上下文中),不允许使用列名。
    mongodb 性能提高之利用索引, 待续
    工程化 经历的 4 个阶段
    把连续的字符 变成 一个
    sort 排序详解
    理解正则 的 ?! ?:
    [ 订单查询 ] 性能 高并发 : 分表 与 用户id%1024 存放表
    搭建LNMP基础框架
  • 原文地址:https://www.cnblogs.com/jackwang-sparrow/p/15185310.html
Copyright © 2011-2022 走看看