二叉树深度和平衡二叉树的判定

二叉树的深度

对于二叉树的深度的求解,利用递归的方式求解很简单:

下面就来设计这个递归算法:

要求一个节点的高度,先求左子树的高度,然后再求解右子树的高度。
最后树的高度就是1+max(left_depth, right_depth)。
int leftLen = depth_tree(root->left);
int rightLen = depth_tree(root->right);
return 1 + max(leftLen, rightLen);
那么这个递归的出口是什么:
(1)可以递归到1,如果一个节点不为NULL,但是这个节点的左子树为NULL,
并且右子树也为NULL,那么返回高度为1。
但是有这种情况:这个节点的左子树不为NULL,右子树为NULL,上面求leftLen和rightLen的递归还是会传入NULL。
所以这种递归的出口不可行。
(2)索性让递归的出口变成传入NULL参数,也就是说为NULL单独递归一次函数。
if(root == NULL)
	return 0;
就这一个出口就能解决所有的。

算法代码实现:

int depth_tree(TreeNode *root)
{
	if(NULL == root)
	{
		return 0;
	}

	int nLeft = depth_tree(root->left);
	int nRight = depth_tree(root->right);

	return 1 + (nLeft > nRight ? nLeft : nRight);
}

二叉树平衡的判定

还是用递归的想法,想判定根节点是不是平衡的,如果不是就直接返回false,如果是然后就分别去判断这个根的左子树和右子树是否都是平衡的二叉树。

代码实现:

bool IsBalance(TreeNode *root)
{
	if(NULL == root)
		return true;
	int left = depth_tree(root->left);
	int right = depth_tree(root->right);

	if(abs(left-right) > 1)
	{
		return false;
	}

	return IsBalance(root->left) && IsBalance(root->right);
}

但是现在算法的效率还是不够高,求解root的平衡性的时候,我们遍历了左子树和右子树求解子树的高度。当我们求解root孩子的平衡性的时候,还要求解root孩子左右子树的高度,有很大一部分节点重复的被遍历了。所以效率大大的降低了。

判定二叉树平衡的高效算法

前面的算法是,对于每一个节点都要去求解它的左右子树的高度,那么可以利用二叉树的后序遍历方式,当遍历到某个节点的时候,它的左子树和右子树都已经遍历完成,同时要分别带回左、右子树的高度,以便左右子树高度对比。

bool isBalance(TreeNode *root, int *depth)
{
	if(root == NULL)
	{
		*depth = 0;
		return true;
	}
	int left, right;
	if(isBalance(root->left, &left) && isBalance(root->right, &right))
	{
		int diff = left - right;
		if(diff >= -1 && diff <=1)
		{
			*depth = 1 + max(left, right);
			return true;
		}
	}

	return false;
}

这里只是一个后序遍历带回高度的算法,每个节点仅仅的遍历了一次。

时间: 2024-10-10 07:22:26

二叉树深度和平衡二叉树的判定的相关文章

剑指Offer37 二叉树深度与平衡二叉树判断

1 /************************************************************************* 2 > File Name: 37_TreeDepth.cpp 3 > Author: Juntaran 4 > Mail: [email protected] 5 > Created Time: 2016年09月03日 星期六 09时49分38秒 6 ***************************************

二叉树的深度(平衡二叉树)

题目 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 思路 如果一棵树只有一个结点,它的深度为1,如果根节点只有左子树而没有右子树,那么树的深度应该是其左子树的深度+1.同样如果根节点只有右子树而没有左子树,那么树的深度应该是其右子树+1.如果既有左子树又有右子树,那概述的深度就是左.右子树的深度的较大值加1. #include <iostream> using namespace std; struct tree {

二叉树深度、平衡、相等、求遍历

#include <iostream> #include <fstream> #include <string> using namespace std; struct TreeNode { struct TreeNode* left; struct TreeNode* right; char elem; }; //知道先序遍历和中序遍历 求后序遍历 TreeNode* BinaryTreeFromOrderings(char* inorder, char* preor

剑指Offer--040-平衡二叉树(判断一棵二叉树是否是平衡二叉树)[扩展附加题]

链接 牛客OJ:平衡二叉树 九度OJ:未收录 GitHub代码: 040-平衡二叉树 CSDN题解:剑指Offer–040-平衡二叉树 牛客OJ 九度OJ CSDN题解 GitHub代码 040-平衡二叉树 未收录 剑指Offer–040-平衡二叉树 040-平衡二叉树 题意 题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树. 递归法 根据平衡二叉树的定义 平衡二叉树要求对于每一个节点来说,它的左右子树的高度之差不能超过1 因此我们递归的判断每一个根节点,判断左右子树的高度差 递归得到二叉

【3】输入一颗二叉树判断是不是平衡二叉树

题目:输入一颗二叉树的根结点,判断该二叉树是不是平衡二叉树.平衡二叉树是满足所有结点的左右子树的高度差不超过1的二叉树 方案一:遍历数组的每一个结点,对每一个结点求它的左右子树的高度并进行判断.时间复杂度大于O(n),小于O(n^2)效率较低,因为有很多点需要重复访问. //二叉树的结点 struct BinaryTreeNode{ int m_value; BinaryTreeNode *m_lson; BinaryTreeNode *m_rson; }; //求二叉树的深度 int GetD

N39_判断该二叉树是否是平衡二叉树。

题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树. package new_offer; /** * 输入一棵二叉树,判断该二叉树是否是平衡二叉树. * @author Sonya *思路: *1.借鉴上题 求树的深度.但是效率不高 需要重复遍历结点多次. *2.后续遍历,记录每个depth 只需要遍历一次. */ public class N39_IsBalanced_Solution { public boolean IsBalanced_Solution(TreeNode root)

求二叉树深度

概念: 1.二叉树深度:树中结点的最大层次称为树的深度或高度. 2.二叉树层次:从根开始定义起,根为第一层,根的孩子为第二层,以此类推. 要点: 1.递归. 2.二叉树深度为左右子树深度较大值+1. 代码: /* 求二叉树深度 by Rowandjj 2014/7/13 ------------------------------- 题目描述: 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 输入: 第一行输入有n,n表示

二叉树(4)----求二叉树深度

1.二叉树定义 typedef struct BTreeNodeElement_t_ { void *data; } BTreeNodeElement_t; typedef struct BTreeNode_t_ { BTreeNodeElement_t *m_pElemt; struct BTreeNode_t_ *m_pLeft; struct BTreeNode_t_ *m_pRight; } BTreeNode_t; 2.求二叉树深度 定义:对任意一个子树的根节点来说,它的深度=左右子树

编程实现判断一棵二叉树是否是平衡二叉树

Balanced Binary Tree Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never differ by more than 1. 思路:遍历这棵二叉树,每访问