题解 | #树的子结构#

树的子结构

http://www.nowcoder.com/practice/6e196c44c7004d15b1610b9afca8bd88

  1. 一直向左子树挨个节点搜索。进入递归看是否满足条件。如果满足,就返回true。
  2. 在向左的时候要记住当前节点,因为待会还要向右遍历这个树。记入到stack中就好,因为可以倒着来遍历。
  3. 之后每次该节点左走不了之后,弹栈,依次从后往前走当前节点的右节点,当然走右节点的时候,也是往左节点遍历。并把新的右节点压栈,来遍历以后的右节点的右节点。
/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};*/
class Solution {
public:


    bool isSub(TreeNode* pRoot1, TreeNode* pRoot2){

        //base case -1
        if(!pRoot2) return true;
        //base case -2
        if(!pRoot1) return false;


        //三个条件取判断
        return pRoot1->val == pRoot2->val && isSub(pRoot1->left,pRoot2->left) && isSub(pRoot1->right, pRoot2->right);

    }


    bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) {
        if(!pRoot1||!pRoot2) return false;//ps:我们约定空树不是任意一个树的子结构

        stack<TreeNode*> st;//为了保存右结点

        while(pRoot1||!st.empty()){//同时也防止了空节点,同时也为了处理空节点
             while(pRoot1){//同时也防止了空节点
                if(pRoot1->val == pRoot2->val && isSub(pRoot1, pRoot2)) return true;
                 st.push(pRoot1);//为了之后向右
                 pRoot1 = pRoot1->left;//一直向左,然后验证是不是符合。
            }
            TreeNode* t = st.top();
            st.pop();
            pRoot1 = t->right;
        }
       //直接返回false
       return false;

    }
};
剑指Offer 文章被收录于专栏

剑指offer的解析结合

全部评论

相关推荐

10-28 11:04
已编辑
美团_后端实习生(实习员工)
一个2人:我说几个点吧,你的实习经历写的让人觉得毫无含金量,你没有挖掘你需求里的 亮点, 让人觉得你不仅打杂还摆烂。然后你的简历太长了🤣你这个实习经历看完,估计没几个人愿意接着看下去, sdk, 索引这种东西单拎出来说太顶真了兄弟,好好优化下简历吧
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务