对称二叉树->
请实现一个函数,用来判断一棵二叉树是不是对称的。
如果一棵二叉树和它的镜像一样,那么它是对称的。
数据范围
树中节点数量 [0,100][0,100]。
样例
如下图所示二叉树[1,2,2,3,4,4,3,null,null,null,null,null,null,null,null]为对称二叉树: 1 / \ 2 2 / \ / \ 3 4 4 3 如下图所示二叉树[1,2,2,null,4,4,3,null,null,null,null,null,null]不是对称二叉树: 1 / \ 2 2 \ / \ 4 4 3
//对称二叉树(后序)
struct TreeNode {
int val;
TreeNode *leftChild;
TreeNode *rightChild;
TreeNode(int x) : val(x), leftChild(NULL), rightChild(NULL) {}
};
bool compare(linklist leftChild,linklist rightChild)
{
if(leftChild == nullptr && rightChild == nullptr)
return true;
else if(leftChild != nullptr && rightChild == nullptr)
return false;
else if(leftChild == nullptr && rightChild != nullptr)
return false;
else if(leftChild->data != rightChild->data)
return false;
bool outside = compare(leftChild->leftChild,rightChild->rightChild);
bool inside = compare(leftChild->rightChild,rightChild->leftChild);
bool inSame = outside && inside;
return inSame;
}
简化写法->
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) return true;//判断根结点是否存在
return isSame(root->left,root->right);
}
bool isSame(TreeNode* a,TreeNode* b)
{
if(!a || !b) return !a && !b; //三个if语句的判断
if(a->val != b->val) return false;//判断左子树与右子树的值是否相等
return isSame(a->left , b->right) && isSame(a->right , b->left);//递归遍历整个二叉树,当满足条件则返回True
}
};
翻转二叉树->
输入一个二叉树,将它变换为它的镜像。
数据范围
树中节点数量 [0,100][0,100]。
样例
输入树: 8 / \ 6 10 / \ / \ 5 7 9 11 [8,6,10,5,7,9,11,null,null,null,null,null,null,null,null] 输出树: 8 / \ 10 6 / \ / \ 11 9 7 5 [8,10,6,11,9,7,5,null,null,null,null,null,null,null,null]
linklist invertOrder(linklist node)
{
if(node == nullptr) return node;
swap(node->leftChild,node->rightChild);
invertOrder(node->leftChild);
invertOrder(node->rightChild);
return node;
}
二叉树的最大深度->
输入一棵二叉树的根结点,求该树的深度。
从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
数据范围
树中节点数量 [0,500][0,500]。
样例
输入:二叉树[8, 12, 2, null, null, 6, 4, null, null, null, null]如下图所示: 8 / \ 12 2 / \ 6 4 输出:3
class Solution {
public:
int treeDepth(TreeNode* root) {
if(root == NULL) return 0;
int leftHeight = treeDepth(root->left);
int rightHeight = treeDepth(root->right);
return 1 + max(leftHeight , rightHeight);
}
};
简化->
class Solution {
public:
int treeDepth(TreeNode* root) {
if(root == NULL) return 0;
return 1 + max(treeDepth(root->left) , treeDepth(root->right));
}
};
二叉树的最小深度->
//计算最小深度(后序遍历)
int minHeight(linklist node)
{
if(node == nullptr) return 0;
int leftHeight = minHeight(node->leftChild);
int rightHeight = minHeight(node->rightChild);
if(node->leftChild != nullptr && node->rightChild == nullptr)
return 1 + leftHeight;
else if(node->leftChild == nullptr && node->rightChild != nullptr)
return 1 + rightHeight;
return 1 + min(leftHeight , rightHeight);
}