判断二叉树是否平衡、求二叉树的镜像
思路:
判断一棵二叉树是否平衡,我们采用递归子问题的方法,先求出左右子树的深度,然后比较左右子树的深度,如果左右子树的深度差的绝对值小于2则表明此树平衡,由于此算法是不断递归给去求左右子树的深度,然后再判断子树是否平衡,根据左右子树平衡再判断是否平衡(需要重复遍历此树,即遍历左右子树),所以时间复杂度为O(N*N),给出算法代码如下:
int depth(Node* root)
{
if(root==NULL)
return 0;
int left=depth(root->left);
int right=depth(root->right);
return left>right?(left+1):(right+1);
}
bool isBalanced(TreeNode *root) {
if(root==NULL)
return true;
int left=depth(root->left);
int right=depth(root->right);
int tmp=abs(left-right);
if(tmp > 1)
return false;
return isBalanced(root->left) && isBalanced(root->right);
}
优化算法:我们在递归左右子树的时候,让子树返回自己的深度,并判断自己是否平衡(此处只遍历一遍二叉树,其实是用后序的顺序判断)。此处采用返回两个值,所以我们可以使用两个参数来完成!代码如下:
求二叉树的镜像就比较简单,只要判断节点不为空直接交换即可:
#include <iostream>
using namespace std;
#include <queue>
#include <stack>
namespace TREE_TOPIC
{
struct Node