对称二叉树c++_C++ 推断一棵二叉树是否对称

本文介绍了如何使用C++编程判断一棵二叉树是否对称。通过对二叉树的递归遍历,比较左子树翻转后的结构是否与右子树相同,并检查节点值的一致性,最终确定树的对称性。
摘要由CSDN通过智能技术生成

一棵二叉树对称,就是说它假设以根为轴,翻转过去一样。例如以下图所看到的,以虚线为轴。把左边翻转到右边,各顶点及顶点中的值一一相应。

注意,它并不要求单独看子树的时候子树也是对称的,例如以下图,单独看左子树时,左子树是不正确称的,单独看右子树时。右子树也是不正确称的,但这棵本身是对称的。

要推断一棵二叉树是否对称,那就是推断它的左子树翻转过去是否和右子树一样,注意这里的“一样”包含了值也一样。

以下给出代码,当中的样例中的树,就是第一张图中的那棵树:

#include

using namespace std;

struct TreeNode {

int val;

TreeNode *left;

TreeNode *right;

TreeNode(int x) : val(x), left(NULL), right(NULL) {}

};

class Solution {

public:

bool isSymmetric(TreeNode *root) {

if(root==NULL)//假设树为空,对称。返回

return true;

return mySymmetric(root->left,root->right);//否则推断以root为根时。左子树翻转后是否和右子树一样

}

bool mySymmetric(TreeNode *leftChild,TreeNode *rightChild) {

if(leftChild==NULL && rightChild==NULL)//左右子树都为空,对称

return true;

else if(leftChild!=NULL && rightChild==NULL || leftChild==NULL && rightChild!=NULL){//一个空一个非空,则不正确称

return false;

}else{

//否则,再推断

if(mySymmetric(leftChild->left,rightChild->right) //(1)leftChild的左子树和rightChild的右子树对称吗?

&& mySymmetric(leftChild->right,rightChild->left) //(2)leftChild的右子树和rightChild的左子树对称吗?

&& leftChild->val==rightChild->val){ //(3)leftChild和rightChild的值一样吗?

return true;//三个条件都满足,对称

}else

return false;//否则不正确称

}

}

};

int main()

{

//样例

TreeNode root(1);

TreeNode leftChild(2);

TreeNode rightChild(2);

TreeNode leftLeftChild(3);

TreeNode leftRightChild(4);

TreeNode rightLeftChild(4);

TreeNode rightRightChild(3);

root.left=&leftChild;

root.right=&rightChild;

leftChild.left=&leftLeftChild;

leftChild.right=&leftRightChild;

rightChild.left=&rightLeftChild;

rightChild.right=&rightRightChild;

Solution s;

if(true==s.isSymmetric(&root))

cout<

else

cout<

system("pause");

return 0;

}

以下通过几个简单的图来说明一下。

mySymmetric(leftChild->left,rightChild->right)是计算下图中蓝色方框的部分是否关于对称轴对称:

mySymmetric(leftChild->right,rightChild->left)是计算下图中蓝色方框的部分是否关于对称轴对称:

别忘了还要比較它们的值是否相等~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值