(1)单值二叉树
-
解题思路:
通过前序遍历,比较每个根节点与其左右子树的根节点是否相同;相同接着递归下去比较,如果都相同就会把所有的true返回;不相同就会停止递归,把false返回。
/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */ bool isUnivalTree(struct TreeNode* root) { //通过前序遍历,比较每个根节点与其左右子树的根节点是否相同 //相同接着递归下去比较,如果都相同就会把所有的true返回 //不相同就会停止递归,把false返回 //如果根节点直接为空则返回true if(root == NULL){//第一个递归结束条件 return true; } //如果根节点与左右子节点不同则直接返回false //root->left必须放在前面判断是否为空再进行比较 if(root->left && root->left->val != root->val){//第二个递归结束条件 return false; } if(root->right && root->right->val != root->val){//第三个递归结束条件 return false; } //到这里就证明根节点与左右子节点相同,则递到下一层继续判断 return isUnivalTree(root->left) && isUnivalTree(root->right); }
(2)检查两颗树是否相同
-
解题思路:
-
使用前序遍历两棵二叉树,然后判断两棵二叉树节点的情况,一共分为两大类四种情况。
-
第一类两棵二叉树的根节点有为空的:
- 若都为空则是相同的树返回true
- 有一个是空则证明为不相同的树返回false
-
第二类两棵二叉树的根节点都不为空:
- 若两个根节点不相同,则证明为不同的树,返回false。
- 两个根节点相同则在这一层是相同的树,需要继续递下去看两颗子树的根结点情况
/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */ bool isSameTree(struct TreeNode* p, struct TreeNode* q) { //两棵二叉树的根节点都为空则是相同的树 if(p == NULL && q == NULL){//第一个递归结束条件 return true; } //走到这说明肯定有一个子树不为空 //两棵二叉树的根节点有一个是空则证明为不相同的树 if(p == NULL || q == NULL){//第二个递归结束条件 return false; } //两棵二叉树的根节点都不为空且两个根节点不相同,则证明为不同的树 if(p->val != q->val){//第三个递归结束条件 return false; } return isSameTree(p->left,q->left) && isSameTree(p->right,q->right); }
-