目录
剑指 Offer 26. 树的子结构
剑指 Offer 27. 二叉树的镜像
剑指 Offer 28. 对称的二叉树
剑指 Offer 26. 树的子结构
输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)
B是A的子结构, 即 A中有出现和B相同的结构和节点值。
例如:
给定的树 A:3
/ \
4 5
/ \
1 2
给定的树 B:4
/
1
返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。【解法一】这道题和之前做过不太一样,之前做的那个子树问题,它是连带空树也算另一个树的子树,那道题可以利用子树是否相同来进行判断,这这道题,不能利用子树是否相同来判断,就比如这种情况
class Solution { public: bool issame(TreeNode* p, TreeNode* q) { if(p==nullptr && q==nullptr) return true; if(p==nullptr || q==nullptr) return false; if(p->val != q->val) return false; else return issame(p->left, q->left) && issame(p->right, q->right); } bool isSubStructure(TreeNode* A, TreeNode* B) { if(B==nullptr || A==nullptr)return false; if(issame(A,B)) return true; return isSubStructure(A->left, B) || isSubStructure(A->right, B); } };
【解法二】修正
class Solution { public: bool issame(TreeNode* p, TreeNode* q) { if(p==nullptr && q==nullptr) return true; if(p==nullptr && q!=nullptr) return false; if(p!=nullptr && q==nullptr) // 这里是不同点 return true; // 左节点存在但右节点不存在的情况返回一个真 if(p->val != q->val) return false; else return issame(p->left, q->left) && issame(p->right, q->right); } bool isSubStructure(TreeNode* A, TreeNode* B) { if(B==nullptr || A==nullptr)return false; if(issame(A,B)) return true; return isSubStructure(A->left, B) || isSubStructure(A->right, B); } };
剑指 Offer 27. 二叉树的镜像
请完成一个函数,输入一个二叉树,该函数输出它的镜像。
例如输入:
4
/ \
2 7
/ \ / \
1 3 6 9
镜像输出:4
/ \
7 2
/ \ / \
9 6 3 1* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
【解法一】直接利用构造函数原地创建二叉树
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
return root == NULL ? NULL : new TreeNode(root->val, mirrorTree(root->right), mirrorTree(root->left));
【解法二】根据c++string那边拷贝构造现代版(swap交换)得来的想法
class Solution { public: TreeNode* mirrorTree(TreeNode* root) { if(root == nullptr) return nullptr; swap(root->left,root->right); mirrorTree(root->left); mirrorTree(root->right); return root; } };
【解法三】递归遍历
class Solution { public: TreeNode* mirrorTree(TreeNode* root) { if(root == nullptr) return nullptr; TreeNode* left = mirrorTree(root->left); TreeNode* right = mirrorTree(root->right); root->right = left; root->left = right; return root; } };
剑指 Offer 28. 对称的二叉树
请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
1
/ \
2 2
/ \ / \
3 4 4 3
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:1
/ \
2 2
\ \
3 3【解法一】递归遍历左右树
class Solution { public: bool _isSymmetric(TreeNode* p, TreeNode* q) { if(!p && !q) return true; if(!p || !q) return false; if(p->val != q->val) return false; else return _isSymmetric(p->left, q->right) && _isSymmetric(p->right,q->left); } bool isSymmetric(TreeNode* root) { if(!root)return true; return _isSymmetric(root->left, root->right); } };