1.给定一个二叉树,检查它是否是镜像对称的。
#include <bits/stdc++.h>
using namespace std;
struct TreeNode{
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x)
{
val=x;
left=NULL;
right=NULL;
}
};
bool compare(TreeNode* left,TreeNode* right)
{
if(left==NULL&&right!=NULL)
return false;
else if(left!=NULL&&right==NULL)
return false;
else if(left==NULL&&right==NULL)
return true;
else 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;
return isSame;
}
bool isduichen(TreeNode* root)
{
if(root==NULL)
return true;
return compare(root->left,root->right);
}
int main()
{
TreeNode* root=new TreeNode(4);
root->left=new TreeNode(6);
root->right=new TreeNode(6);
root->left->left=new TreeNode(1);
root->right->right=new TreeNode(1);
cout<<isduichen(root);
return 0;
}
思路:首先我们要弄清楚比较的是根节点的左右子树,是两棵树,那么镜像对称即左子树的左孩子与右子树的右孩子相同,左子树的右孩子与右子树的左孩子相同,其实就是相当于外侧节点和内侧节点的比较。这里我们使用递归法。
因为比较的是左右子树,参数就选择左右子树节点,如果两者都存在且值相同,就向下递归比较左子树的左子树与右子树的右子树,其次递归左子树的右子树和右子树的左子树。
注意就是刚开始左右子树若均为NULL,此时该二叉树也是对称的。
2.给定一个二叉树,找出其最大深度。
#include <bits/stdc++.h>
using namespace std;
struct TreeNode{
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x)
{
val=x;
left=NULL;
right=NULL;
}
};
int getheight(TreeNode* root)
{
if(root==NULL)
return 0;
int leftheight=getheight(root->left);
int rightheight=getheight(root->right);
int height=1+max(leftheight,rightheight);
return height;
}
int main()
{
TreeNode* root=new TreeNode(2);
root->left=new TreeNode(3);
root->right=new TreeNode(5);
root->left->left=new TreeNode(6);
root->left->right=new TreeNode(7);
int t=getheight(root);
cout<<t;
return 0;
}
首先我们要搞清楚什么是高度,什么是深度,高度是指节点到叶子节点的距离,深度是指节点到根节点的距离,而这里我们要求的最大深度,就是叶子节点到根节点的距离,不就是根节点的高度吗,所以这道题看似我们求的是高度,其实是深度。
这里使用后序遍历来求深度,相当于先将左右子树的高度遍历出来,之后将这个信息传给中节点,中节点此时取两个子树中高度较大的一个,其自身再+1,那么其高度就求出来了。同时我们要知道,实际上左右子树传递的方向是从下向上,那么不就是从叶子节点出发,最终到了根节点吗,自然就把深度求出来了。
3.给定一个二叉树,找出其最小深度。
#include <bits/stdc++.h>
using namespace std;
struct TreeNode{
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x)
{
val=x;
left=NULL;
right=NULL;
}
};
int get_height(TreeNode* root)
{
if(root==NULL)
return 0;
int left_height=get_height(root->left);
int right_height=get_height(root->right);
if(root->left==NULL&&root->right!=NULL)
return 1+left_height;
else if(root->left!=NULL&&root->right==NULL)
return 1+right_height;
int result=1+min(left_height,right_height);
return result;
}
int main()
{
TreeNode* root=new TreeNode(1);
root->left=new TreeNode(4);
root->right=new TreeNode(5);
root->left->left=new TreeNode(8);
cout<<get_height(root);
return 0;
}
思路:求二叉树的最小深度就是求从根节点到最近叶子节点的最短路径上的节点数量,在这里我们尤其要考虑左右节点为空时,可不是最小深度,因为没有叶子节点,因此在有叶子节点的前提下,我们去求其深度。在这里我们使用前序遍历的方法,在根节点不为空的情况下,进行遍历,先进行对左子树的递归遍历,然后再是右子树递归遍历,最后返回最小深度,如果左右节点均不为空,返回较小深度的,如果出现左右节点为空的,就返回不为空的那一个再加1。