剑指 Offer 26. 树的子结构
输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)
B是A的子结构, 即 A中有出现和B相同的结构和节点值。
例如:
给定的树 A:
3
/ \
4 5
/ \
1 2
给定的树 B:
4
/
1
返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。
输入:A = [1,2,3], B = [3,1] 输出:false输入:A = [3,4,5,1,2], B = [4,1] 输出:true
解答代码
首先我们对A树进行一次左序遍历(方式应该不重要),
在遍历的过程中,对每个节点进行一次check遍历,检查以该A节点为root的树是否包含子树B。
check主要检查,A 、B对应位置节点是否具有题目要求条件的val和分叉;
check逻辑同理正常左序遍历,若每部check都相同,则在回溯时返回true。
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: bool check(TreeNode* A, TreeNode* B) { //完全一致是错的,正确的是B有的,A得有,B没有的,A可有可无 //if(B->val!=A->val || ((B->left==NULL)!=(A->left==NULL))||((B->right==NULL)!=(A->right==NULL)))return false; if(B->val!=A->val)return false; if(B->left!=NULL) { if(A->left==NULL) return false; } if(B->right!=NULL) { if(A->right==NULL) return false; } bool dl=true,dr=true; if(B->left!=NULL) dl=check(A->left,B->left); if(B->right!=NULL) dr=check(A->right,B->right); return (dl)&&(dr); } bool isSubStructure(TreeNode* A, TreeNode* B) { if(B==NULL||A==NULL)return false; TreeNode *pa=A,*pb=B; queue<TreeNode * > qt; qt.push(pa); while(!qt.empty()) { TreeNode *p=qt.front(); qt.pop(); if(p->left!=NULL) qt.push(p->left); if(p->right!=NULL) qt.push(p->right); if(check(p,B)) return true; } return false; } };
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!