day8

1.剑指 Offer 26. 树的子结构

 recur函数递归用来判断树B是否是树A的子结构:如果B为空,说明树B已全部遍历完,不管A是否为空,树B都是树A的子结构;

                                                                     如果 在B不为空的情况下A为空 或者 两者某个对应位置的节点不同 ,那么树B就不是树A的子结构;

 isSubStructure函数递归是为了遍历A的左子树和右子树

14行(满足树B是树A的子结构的情况):A,B相等 || 树B是树A左子树的子结构 || 树B是树A右子树的子结构 (前面用于判断,后面用于遍历

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Solution {
11 public:
12     bool isSubStructure(TreeNode* A, TreeNode* B) {
13       if(A == NULL || B == NULL) return false;
14       return recur(A,B) || isSubStructure(A -> left,B) || isSubStructure(A -> right,B);
15     }
16 
17     bool recur(TreeNode* A,TreeNode* B){
18         if(B == NULL) return true;
19         if(A == NULL || (A -> val != B -> val)) return false;
20         return recur(A -> left,B -> left) && recur(A -> right,B -> right);
21     }
22 };

2.剑指 Offer 27. 二叉树的镜像

 与1题同样 mirrorTree函数递归是为了遍历左右子树;exchange函数是用来交换root的左右子树的

 14、15、16行:先分别将左右子树变成其镜像,然后交换左右子树位置,这样整棵树就都是镜像了

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Solution {
11 public:
12     TreeNode* mirrorTree(TreeNode* root) {
13       if(! root) return root;
14       if(root -> left)  mirrorTree(root -> left);
15       if(root -> right) mirrorTree(root -> right);
16       exchange(root);
17       return root;
18     }
19 
20     void exchange(TreeNode* root){
21         if(root -> left == NULL && root -> right == NULL) return;
22         else if(root -> left == NULL && root -> right != NULL){
23           root -> left = root -> right;
24           root -> right = NULL;
25         }
26         else if(root -> left != NULL && root -> right == NULL){
27           root -> right = root -> left;
28           root -> left = NULL;
29         }
30         else{
31           TreeNode* tmp = root -> left;
32           root -> left = root -> right;
33           root -> right = tmp;
34         }
35     }
36 };

 简化版本:

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Solution {
11 public:
12     TreeNode* mirrorTree(TreeNode* root) {
13       if(! root) return root;
14       TreeNode* tmp = root -> left;
15       root -> left = mirrorTree(root -> right);
16       root -> right = mirrorTree(tmp);
17       return root;
18     }
19 };

3.剑指 Offer 28. 对称的二叉树

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Solution {
11 public:
12     bool isSymmetric(TreeNode* root) {
13       if(root == nullptr) return true;
14       return Symmetry(root -> left,root -> right);
15     }
16 
17     bool Symmetry(TreeNode* L,TreeNode* R){
18       if(L == nullptr && R == nullptr) return true;
19       else if(L && R)
20       {
21         if(L -> val == R -> val) 
22           return Symmetry(L -> left,R -> right) && Symmetry(L -> right,R -> left);
23         else                     
24           return false;
25       }
26       else       //一个为空一个不为空
27         return false;
28     }
29 };

简洁版本:

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Solution {
11 public:
12     bool isSymmetric(TreeNode* root) {
13       if(root == nullptr) return true;
14       return Symmetry(root -> left,root -> right);
15     }
16 
17     bool Symmetry(TreeNode* L,TreeNode* R){
18       if(L == nullptr && R == nullptr) return true;
19       if(L == nullptr || R == nullptr || L -> val != R -> val) return false;
20       return Symmetry(L -> left,R -> right) && Symmetry(L -> right,R -> left);
21     }
22 };

 

posted @ 2022-07-02 22:26  balabalahhh  阅读(29)  评论(0)    收藏  举报