怎样推断一棵树是否是平衡二叉树

推断的思路非常easy。若一棵树是平衡二叉树,它的左右子树都是平衡二叉树,而且左右子树的高度差小于等于1。注意。实现的时候,推断左右子树的平衡性时。能够顺便计算子树高度,不用再另外计算一次。以下是其递归实现:

#include <iostream>
using namespace std;
struct TreeNode {
	int val;
	TreeNode *left;
	TreeNode *right;
	TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution {
public:
    bool isBalanced(TreeNode *root) {
        int height;
		return myBalance(root,height);
    }
	bool myBalance(TreeNode *root, int &height){//注意,将height用引用传进来
		if(root==NULL){//若为空,高度就为0,平衡
			height=0;
			return true;
		}
		int leftHeight;
		int rightHeight;
		bool leftBalance=myBalance(root->left,leftHeight);//root的左子树平衡吗?
		bool rightBalance=myBalance(root->right,rightHeight);//root的右子树平衡吗?
		height=max(leftHeight,rightHeight)+1;//以root为根的这棵树的高度。是root的左子树、右子树中的较高者加上root本身这个结点(即加1)
		if(leftBalance && rightBalance && abs(leftHeight-rightHeight)<=1)//假设左子树平衡,右子树平衡,而且左右子树高度差小于等于1
			return true;
		return false;
	}
};
int main()
{
	TreeNode *root=new TreeNode(1);
	TreeNode *left=new TreeNode(2);
	TreeNode *right=new TreeNode(3);
	root->left=left;
	root->right=right;
	Solution *s=new Solution();
	cout<<s->isBalanced(root)<<endl;
	system("pause");
	return 0;
}
时间: 2024-08-08 18:19:57

怎样推断一棵树是否是平衡二叉树的相关文章

二叉树——判断一棵树是否是平衡二叉树

平衡二叉树 (空树或者左右两个孩子高度差不超过1) 在涉及到二叉树的题目时,递归函数非常好用 列出可能性->整理出返回值的类型->整个递归过程按照同样的结构得到子树的信息,整合子树的信息,加工出应该返回的信息,向上返回 1.左子树是否平衡 2.右子树是否平衡 3.左子树的高度 4.右子树的高度 根据可能性,使用递归函数 可能性->返回值的类型 //列出可能性 左右子树是否分别平衡,若平衡后,左右子树的高度 public static class ReturnData{ boolean i

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

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. 思路:遍历这棵二叉树,每访问

怎样推断一棵二叉树是全然二叉树

严蔚敏那本教材上的说法:一个深度为k,节点个数为 2^k - 1 的二叉树为满二叉树.这个概念非常好理解, 就是一棵树,深度为k,而且没有空位. 首先对满二叉树依照广度优先遍历(从左到右)的顺序进行编号. 一颗深度为k二叉树,有n个节点,然后,也对这棵树进行编号,假设全部的编号都和满二叉树相应,那么这棵树是全然二叉树. 随意的一个二叉树,都能够补成一个满二叉树.这样中间就会有非常多空洞.在广度优先遍历的时候,假设是满二叉树,或者全然二叉树,这些空洞是在广度优先的遍历的末尾,所以,但我们遍历到空洞

C++ 推断一棵二叉树是否对称

一棵二叉树对称,就是说它假设以根为轴,翻转过去一样.例如以下图所看到的,以虚线为轴.把左边翻转到右边,各顶点及顶点中的值一一相应. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvT3J0aG9jZW50ZXJDaG9jb2xhdGU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" > 注意,它并不要求单独看子树的时候子树也是对称的,例如以下图

LeetCode:Binary Tree Paths - 获取一棵树从顶点到每个叶节点的路径

1.题目名称 Binary Tree Paths(获取一棵树从顶点到每个叶节点的路径) 2.题目地址 https://leetcode.com/problems/binary-tree-paths/ 3.题目内容 英文:Given a binary tree, return all root-to-leaf paths. 中文:给定一颗二叉树,返回所有的根节点到叶节点的路径 例如:现有一颗二叉树    1  /   2     3    5 所有由根节点到叶节点的路径如下: ["1->2-

(015)实现一个函数检查一棵树是否平衡(keep it up)

实现一个函数检查一棵树是否平衡.对于这个问题而言, 平衡指的是这棵树任意两个叶子结点到根结点的距离之差不大于1. 这个题我们可以采用暴力搜索,找到叶子节点到根节点的最小值和最大值,然后他们的差如果大于1就不是平衡树,反之 则是平衡树. int MinDepth = std::numeric_limits<int>::max(); int MaxDepth = std::numeric_limits<int>::min(); struct TreeNode { int data; T

二棵树某两个节点的公共祖先。

1. 如果是有parent指针的树,可以转化成 求两个链表第一个公共节点的问题. 对于无parent指针普通二叉树(假定这两个节点一定在树中,否则需要先遍历一边树查找是否存在该节点) 1. (剑指offer的解法),先用一定的空间记录从根节点到两个节点各自的路径,然后找这两个路径最后一个相交的节点. 2.  CC150,递归求解. TreeNode commonAncestor(TreeNode root, TreeNode p, TreeNode q){ } 二棵树某两个节点的公共祖先.,布布

种一棵树最好的时间是十年前,其次是现在

这不是一篇鸡汤,只是一个回头的娃的故事罢了. 1.前言 2016年堪称一个人生转折点,经历了太多的事情,这篇文章就当作一年的总结吧,虽然又拖延了两月才写完,不过有了更多的反思,反而更能看清自己,这个借口还可以.非得来一句鸡汤,那就是种一棵树最好的时间是十年前,其次是现在. 2.缘起 在各种公司里员工都会有级别之分,比如开发,高级开发和资深开发这样的Title划分,总会有一个能力层次的标识.我刚进公司时Title自然是开发,因此也会想知道如何才算高级或者资深的开发,努力的方向在哪里.在这之前,我一

如何将一棵树转化为对应的二叉树

如何将一棵树转化为对应的二叉树? 解答: 1. 将 节点的孩子 放在左子树: 2. 将 节点的兄弟 放在右子树. 例题: 答案: 延伸: 任何一棵树都可以表示成二叉树,并不是任何一棵二叉树都可以表示成树.那么树多还是二叉树多? 1. 任何一棵树都可以表示成二叉树,结合以上题目很容易理解. 2.不是任何一棵二叉树都可以表示成树: 当根节点包含右子树的时候,就无法表示成树了. 3. 树多还是二叉树多的问题: 二叉树也是树的一种,如果按照包含关系来说,树肯定包含二叉树了,树多一些