zoukankan      html  css  js  c++  java
  • 剑指offer-子树结构

    描述

    输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
     
    求解思路:
    1. 首先肯定是找到树A中等于树B根节点的节点。
    2. A和B按照同样的遍历顺序比较,如果全相同A就是子树。

    代码:

     1 class Solution {
     2 public:
     3     // 肯定是先在A中找到和B根节点相同的节点
     4     // 舍弃的思路:然后可以通过向量记录比较顺序,1为左,2为右=》有点难以保证正确性
     5     // 采取的思路:A就按照B的遍历顺序,依次比较B的节点val,如果全相同,就是的
     6     bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) {
     7         // 遍历A树找B的根节点,这里先序遍历较快点
     8         if(pRoot1==nullptr || pRoot2==nullptr) return false;
     9         return subStruct(pRoot1,pRoot2) ||
    10                HasSubtree(pRoot1->left,pRoot2) ||
    11                HasSubtree(pRoot1->right,pRoot2);
    12     }
    13     
    14     // 用层次遍历肯定是可以的,如果就用前序遍历可以吗?
    15     bool subStruct(TreeNode* ar,TreeNode* br){
    16         if(br==NULL) return true;  // B树节点为nullptr,就不需要比了
    17         if(br!=NULL && ar==NULL) return false; // 防止段错误
    18         if(br->val!=ar->val) return false;   // 其实这里和上面一行都是逻辑判断,也就是前序比较部分
    19         return subStruct(ar->left, br->left) &&  // AB按照相同遍历顺序比较
    20                subStruct(ar->right, br->right);
    21     }
    22 };
    心之所愿,永不相忘
  • 相关阅读:
    「SAM」你的名字
    「疫期颓废」2
    「疫期颓废」1
    代码覆盖率简单介绍
    解决git报ssh variant 'simple' does not support setting port
    接口自动化基本流程和测试思路
    wait和sleep的区别
    vm垃圾回收算法的简单理解
    TCP-三次握手和四次挥手简单理解
    浏览器输入一个url 中间经历的过程
  • 原文地址:https://www.cnblogs.com/zgll/p/15070945.html
Copyright © 2011-2022 走看看