《从头再来》剑指offer.26 树的子结构
Posted 欢迎来到我的酒馆,快找个位置随便坐!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《从头再来》剑指offer.26 树的子结构相关的知识,希望对你有一定的参考价值。
输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)(注意分辨,树的子树和树的子结构是不一样的!树的子树必须到根结点都满足完全一样,而子结构可以只是子树的一部分)
B是A的子结构, 即 A中有出现和B相同的结构和节点值。
例如:
给定的树 A:
3
/ \\
4 5
/ \\
1 2
给定的树 B:
4
/
1
返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。
构建一个辅助函数,用于判断当B和A的节点值相同的时候,B是否是A的子结构,如果某一个节点A不为空,但对应位置的节点B为空,则B是A的子结构;如果A节点为空,或者A、B的值不等,则B不是A的子结构;如果完全一直,则递归的判断左右子节点是否相等。主函数同样进行递归的判断,A或B为空,则直接返回false;如果两棵树相同,则返回true;否则递归的判断B树是否是A树的左子树或者右子树的子树。
/** * 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: //辅助函数用于判断B是否是A的子树 //如果B为空,则是 //如果A为空或者A、B的值不相等,则不是 //如果相等,则判断左右节点的值是否相等 bool isSame(TreeNode* A, TreeNode* B){ if(!B) return true; if(!A || A->val != B->val) return false; return isSame(A->left, B->left) && isSame(A->right, B->right); } bool isSubStructure(TreeNode* A, TreeNode* B) { if(!A || !B) return false; if(isSame(A, B)) return true; return isSubStructure(A->left,B) || isSubStructure(A->right, B); } };
《从头再来》
以上是关于《从头再来》剑指offer.26 树的子结构的主要内容,如果未能解决你的问题,请参考以下文章
剑指 Offer 26. 树的子结构 / 剑指 Offer 27. 二叉树的镜像 / 剑指 Offer 28. 对称的二叉树 / 剑指 Offer 29. 顺时针打印矩阵