二叉树习题 ---- 对称,翻转,最大or最小深度(无解析)

 对称二叉树->

请实现一个函数,用来判断一棵二叉树是不是对称的。

如果一棵二叉树和它的镜像一样,那么它是对称的。

数据范围

树中节点数量 [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);		    
}

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

记得开心一点嘛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值