目录
1. 单值二叉树
1.1 题目链接与描述
1.2 解题思路
1.3 程序
2. 相同的树
2.1 题目链接与描述
2.2 解题思路
2.3 程序
3. 对称二叉树
3.1 题目链接与描述
3.2 解题思路
3.3 程序
1. 单值二叉树
1.1 题目链接与描述
题目链接:
965. 单值二叉树 - 力扣(LeetCode)
题目描述:
如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。
只有给定的树是单值二叉树时,才返回 true
;否则返回 false
。
1.2 解题思路
思路1:遍历法,遍历二叉树进行值的对比,若全部值相同则返回true,否则返回false;
思路2:分治法:
如果二叉树为空,则返回true;
如果二叉树非空,则依次将当前根结点的值与左右孩子结点的值进行比较,不等则返回false;
1.3 程序
/*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/
bool isUnivalTree(struct TreeNode* root) {if (root == NULL)return true;if (root->left && root->left->val != root->val)return false;if (root->right && root->right->val != root->val)return false;return isUnivalTree(root->left)&&isUnivalTree(root->right);
}
2. 相同的树
2.1 题目链接与描述
题目链接:
100. 相同的树 - 力扣(LeetCode)
题目描述:
给你两棵二叉树的根节点 p
和 q
,编写一个函数来检验这两棵树是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
2.2 解题思路
分治思想,两棵树的根与根相比,左子树与左子树比较,右子树与右子树比较,对于每一棵子树,仍然采用根、左子树、右子树的顺序进行比较。
2.3 程序
/*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/
bool isSameTree(struct TreeNode* p, struct TreeNode* q) {if (p == NULL && q == NULL)return true;// 一个为空一个不为空if (p == NULL || q == NULL)return false;if (p->val != q->val)return false;return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}
3. 对称二叉树
3.1 题目链接与描述
题目链接:
101. 对称二叉树 - 力扣(LeetCode)
题目描述:
给你一个二叉树的根节点 root
, 检查它是否轴对称。
3.2 解题思路
除根结点外,从第二层子树开始,根与根比较,一个根结点的左子树与另一个根结点的右子树比较,一个根结点的右子树与另一个根结点的左子树比较。
与第二题思路类似,为了更方便实现两棵子树的对称比较,再封装一个函数isSubSymmic,将第二层的两个结点指针作为参数传递给该函数。
3.3 程序
/*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/
bool isSubSymmetric(struct TreeNode* leftTreeNode,struct TreeNode* rightTreeNode){if (leftTreeNode == NULL && rightTreeNode == NULL)return true;if (leftTreeNode == NULL || rightTreeNode == NULL)return false;if (leftTreeNode->val != rightTreeNode->val)return false;return isSubSymmetric(leftTreeNode->left, rightTreeNode->right)&&isSubSymmetric(leftTreeNode->right, rightTreeNode->left);
}
bool isSymmetric(struct TreeNode* root) {if (root == NULL)return true;return isSubSymmetric(root->left,root->right);
}