题目描述:
输入一棵二叉树的根结点,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
题目解析:
采用递归遍历:
1)如只有1个节点,深度就为1
2)当前结点的深度就是它的左子树和右子树中深度大的一个再加1.
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
int TreeDepth(TreeNode* pRoot)
{
if(pRoot == NULL)
return 0;
int leftDepth = TreeDepth(pRoot->left);
int rightDepth = TreeDepth(pRoot->right);
return leftDepth > rightDepth ? leftDepth+1 : rightDepth+1;
}
};
拓展:
判断一个二叉树是不是平衡二叉树?
平衡二叉树是指左子树和右子树的高度差不超过1。
有两种方法:
方法一:对节点进行重复遍历
每遍历到一个节点,需要对它的左右子树求高度差,如果高度差小于2,那么就返回true,从上到下,递归中套递归,会反复的求当前结点的高度,O(n*n),递归的时间复杂度=递归的深度*递归的次数。
方法二:每个节点只遍历一次
用一个引用变量记录当前的高度,避免重复计算高度。从下到上,递归判断是不是平衡二叉树。
class Solution{
public:
//方法一:对多个节点进行重复遍历
//每遍历到一个节点,需要对它的左右子树求高度差,会反复的求高度
//O(n)
int Height(TreeNode* root)
{
if(root == NULL)
return 0;
int leftHeight = Height(root->left);
int rightHeight = Height(root->right);
return leftHeight > rightHeight ? leftHeight+1 : rightHeight + 1;
}
//判断二叉树是否为平衡二叉树
bool IsAVLBinaryTree(TreeNode* root)
{
if(root == NULL)
return true;
//平衡因子
int pf = abs(Height(root->left)-Height(root->right));
return ((pf < 2) && (IsAVLBinaryTree(root->left))
&& (IsAVLBinaryTree(root->right)));
}
//方法二:遍历一遍的算法
//需要一个引用变量记录当前的高度
bool IsAVLBinaryTree2(TreeNode* root,int& depth)
{
if(root == NULL)
{
depth = 0;
return true;
}
int left = 0;
int right = 0;
if(IsAVLBinaryTree2(root->left,left) && IsAVLBinaryTree2(root->right,right))
{
int pf = abs(right-left);
if(pf < 2);
{
depth = (left > right) ? left+1 : right+1;
return true;
}
}
return false;
}
};
(*^▽^*)