判断一棵二叉树是不是平衡二叉树

二叉树中任意左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。

两种解法。

第一种:菜鸟的解法,出现重复遍历,时间复杂度高。


 1 bool IsBalanced(BinaryTreeNode* root)
2 {
3 if (root == NULL)
4 {
5 return true ;
6 }
7 int left = TreeDepth(root->m_pLeft);//该函数实现见我上一篇博客“数的深度”
8 int right = TreeDepth(root->m_pRight);
9 if ((left - right) > 1 || (left - right) < -1)
10 {
11 return false ;
12 }
13 else
14 return IsBalanced(root->m_pLeft) && IsBalanced(root->m_pRight);
15 }

第二种:大神的解法,只遍历一次,高端大气上档次。


 1 bool IsBalanced2(BinaryTreeNode* root , int& Depth)
2 {
3 if (root == NULL)
4 {
5 Depth = 0 ;
6 return true ;
7 }
8 int left , right ;
9 if (IsBalanced2(root->m_pLeft, left) && IsBalanced2(root->m_pRight, right))
10 {
11 int diff = left - right ;
12 if (diff <= 1 && diff >= -1)
13 {
14 Depth = 1 + (left > right ? left : right );
15 return true ;
16 }
17 }
18
19 return false ;
20
21 }
22 bool IsBalanced2(BinaryTreeNode* root)
23 {
24 int Depth = 0 ;
25 return IsBalanced2(root , Depth);
26 }

判断一棵二叉树是不是平衡二叉树,布布扣,bubuko.com

时间: 2024-12-22 10:49:24

判断一棵二叉树是不是平衡二叉树的相关文章

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

方法一 算法思想:用后序遍历的方式遍历二叉树的每一个结点,在遍历到一个结点之前我们已经遍历了它的左右子树,只要在遍历每个结点的时候记录下它的高度,我们就可以一边遍历一边判断每个结点是不是平衡的. 代码如下: 1 typedef struct BinaryTree 2 { 3 int data; 4 BinaryTree *lc; 5 BinaryTree *rc; 6 }*BinaryTree; 7 8 bool isBalance(BinaryTree *pRoot,int *depth) 9

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

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

比较两棵二叉树--(比较两棵二叉树是否相同/判断一棵二叉树是否是另一棵二叉树的子树)

一,问题介绍 本文章讨论两个问题: ①如何判断两棵二叉树的结构是一样的.对应的每个结点都有着相同的值.--即判断两棵二叉树是一样的 ②给定两棵二叉树,如何判断一棵二叉树是另一棵二叉树的子结构 ③给定两棵二叉树,如何判断一棵二叉树是另一棵二叉树的子树 注意,子结点与子树有那么一点点不同. 上面的二叉树B 是二叉树A 的子结构,但是不能说是二叉树A的子树.但是二叉树C 是 二叉树A的子树. 二,问题分析 1,如何判断两棵二叉树的结构是一样的.且对应的每个结点都有着相同的值. 对于①如何判断两棵二叉树

判断一棵二叉树是否是完全二叉树

题目:判断一棵二叉树是否是完全二叉树 思路: 1.首先明确完全二叉树的概念.完全二叉树除最后一层外,所有层结点数均达到最大值,最后一层结点连续集中在最左边.空树也是完全二叉树. 2.我们可以通过层序遍历的方式遍历这个二叉树,使用一个队列存储遍历的结点.可以利用最后一层的结点集中在左侧这个特性解题,具体看代码: 代码: bool isCompleteTree(pTree pT) { Queue q; initQueue(&q); Enqueue(&q,pT);//根入队 pNode ptr

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

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

【面试】判断一棵二叉树是否为二叉排序树

一.描述 给定一棵二叉树,如何判断一棵树是否是二叉排序树.给出树结点定义如下 class TreeNode { int key; TreeNode left; TreeNode right; public TreeNode(int key) { this.key = key; } } 二.解题思路 根据二叉排序树的性质,在进行中序遍历的时候,当前结点的值总是大于前驱结点的值,需要在遍历时保存前驱结点的值,这样有利于进行判断,基于这样的思路来进行解题. 三.代码 根据以上的解题思路(遍历时利用二叉

判断一棵二叉树是否为BST,一棵树是否为完全二叉树

对于一颗搜索二叉树,最简单的方法就是用中序遍历,看是不是一个递增数列,如果是则是一颗搜索二叉树,如果不是则不是搜索二叉树.在这里用一个lastVisit去记录上一次搜索到的节点.整个过程就是先找到最左下角的节点,更新这个lastVisit为这个节点的值,然后按照中序遍历依次更新即可.代码如下. 1 #include <stdio.h> 2 #include <climits> 3 4 //二叉树结点 5 typedef struct binary_tree_node_t{ 6 bi

C++算法之 求二叉树中叶子节点的个数 与 判断两棵二叉树是否结构相同

//叶子节点的个数 /* (1)如果二叉树为空,返回0 (2)如果二叉树不为空且左右子树为空,返回1 (3)如果二叉树不为空,且左右子树不同时为空,返回左子树中叶子节点个数加上右子树中叶子节点个数 */ int GetLeafNodeNum(BTree* root) { if(root == NULL) return 0; if(root->m_pLeft == NULL && root->m_pRight == NULL) return 1; int LeafNumOfLef

二叉查找树(5) - 判断一棵二叉树是否为BST

在本系列的第一篇文章中,已经介绍过了二叉查找树的一些性质: 节点的左子树中任意节点值小于根节点 节点的右子树中任意节点值大于根节点 左右子树都必须是二叉查找树,不允许存在重复节点. 基于上面的这些性质,自然的就得到了这种判断方式:树中的每个节点都有一个特定的值. 假设树的节点定义为: struct Node { int key; Node *left; Node *right; }; 方法1 (实现简单,但却是错误的) 对于每个节点,检测它的左孩子节点是否小于它,且右孩子节点是否大于它. boo