标签:tree node 左右子树 有一个 左右 参数 ret 对比 镜像 com
请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
具体来讲就是加入以根结点为中心画一条垂线,则从垂线往左右两边移动时,遇到的节点的值一定一样。这里需要借助辅助函数来对比左右节点,所以要构建辅助函数。
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: //对比左右节点,所以参数为左右节点 bool compare(TreeNode* left, TreeNode* right){ //如果左右子树都为空,则对称 //如果左子树存在,右子树为空,则不对称 //如果右子树存在,左子树为空,则不对称 //如果左子树右子树的值不同,也不对称 if(left == nullptr && right == nullptr) return true; if(left == nullptr && right != nullptr) return false; if(left != nullptr && right == nullptr) return false; if(left->val != right->val) return false; //所有的不等都对比完了,那么就是左右节点的值相等了 //开始对比左右值 bool outside = compare(left->left, right->right);//左子树的左节点和右子树的右节点对比 bool inside = compare(left->right, right->left);//左子树的右节点和右子树的左节点对比 bool isSame = outside && inside;//必须两个都为true才会返回true return isSame; } bool isSymmetric(TreeNode* root) { //递归的判断根结点的左子树是否和右子树完全一样 //需要对比的其实是根结点左子树的左孩子和右子树的右孩子;以及根结点的左子树的右孩子和右子树的左孩子 //首先如果root为空,则一定是true if(root == nullptr) return true; //只有一个根结点,也是true //if(root->left == nullptr && root->right == nullptr) return true; return compare(root->left,root->right); } };
代码里已经解释得很清楚了,就不再解释了。
《从头再来》
标签:tree node 左右子树 有一个 左右 参数 ret 对比 镜像 com
原文地址:https://www.cnblogs.com/azie420/p/14856334.html