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
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    stat(),lstat(),fstat() 获取文件/目录的相关信息
    lseek() 定位一个已经打开的文件
    Android 自定义View修炼-仿360手机卫士波浪球进度的实现
    Android 自定义View修炼-仿QQ5.0 的侧滑菜单效果的实现
    小蔡计算器 V4.0新版全新发布上线啦~欢迎大家下载使用哈~
    小蔡电脑助手3.0新版全新发布上线啦~欢迎大家下载使用哦~
    考试必备神器-真题园手机客户端Android版1.1正式上线啦,欢迎大家下载使用!
    Android开发之位置定位详解与实例解析(GPS定位、Google网络定位,BaiduLBS(SDK)定位)
    Android开发之自定义圆角矩形图片ImageView的实现
    Android开发之自定义圆形的ImageView的实现
  • 原文地址:https://www.cnblogs.com/jackwang-sparrow/p/15185310.html
Copyright © 2011-2022 走看看