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 };
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号