二叉树的深度

题目描述:

输入一棵二叉树的根结点,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。

题目解析:

采用递归遍历:

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;
	}
};

(*^▽^*)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值