题目
请完成一个函数,输入一个二叉树,该函数输出它的镜像。例如下图所示,左图是原二叉树,而右图则是该二叉树的镜像
思路
- 先序遍历原二叉树的每个节点,如果遍历到的结点有子结点,就交换它的两个子结点。
- 递归遍历每个节点的子节点,同样,如果遍历到的子节点有子节点,就交换它的两个子节点。
当交换完所有非叶子结点的左右子结点之后,就得到了树的镜像。
/* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } };*/ class Solution { public: //先序 void Mirror(TreeNode *root) { if(root==nullptr) return ; if(root->left==nullptr&&root->right==nullptr) return ; TreeNode *tmp=root->left; root->left=root->right; root->right=tmp; if(root->left) Mirror(root->left); if(root->right) Mirror(root->right); return ; } }; /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } };*/ class Solution { public: //后序 void Mirror(TreeNode *root) { if(root==nullptr) return ; if(root->left==nullptr&&root->right==nullptr) return ; if(root->left) Mirror(root->left); if(root->right) Mirror(root->right); TreeNode *tmp=root->left; root->left=root->right; root->right=tmp; return ; } };
判断一棵二叉树是不是对称二叉树
/* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } }; */ class Solution { public: bool isSymmetrical(TreeNode* root) { if(!root) return true; return isSymmetricalCore(root->left,root->right); } private: bool isSymmetricalCore(TreeNode *left,TreeNode *right) { if(!left&&!right) return true; else if(!left||!right) return false; return left->val==right->val&& isSymmetricalCore(left->left,right->right)&&isSymmetricalCore(left->right,right->left); } };