[容易]平衡二叉树

题目来源:http://www.lintcode.com/zh-cn/problem/balanced-binary-tree/

C++版 VS2012测试通过:

 1 #include <iostream>
 2 #include <vector>
 3 #include <queue>
 4 #include <algorithm>
 5 using namespace std;
 6
 7 class TreeNode {
 8 public:
 9     int val;
10     TreeNode *left, *right;
11     TreeNode(int val=-1) {
12         this->val = val;
13         this->left = this->right = NULL;
14     }
15 };
16
17 //以前序遍历创建二叉树
18 //输入12##34##5##,测试结果是3,true
19 //输入1#34##5##,测试结果是-1,false
20 void CreateBiTree(TreeNode **T)//*T是指向BiTNode的指针
21 {
22     *T=new TreeNode;
23     if(*T==NULL)//如果*T还是指向NULL,表示内存分配失败,退出程序
24         exit(OVERFLOW);
25     char ch;
26     cin>>ch;
27       if(ch==‘#‘)
28         *T=NULL;
29     else
30     {
31         (*T)->val=ch-‘0‘;//*T指向的节点的data分配内容,即生成根节点
32         CreateBiTree(&((*T)->left));//创建&(*T)->lchild临时变量,传入CreateBiTree,构造左子树
33         CreateBiTree(&((*T)->right));//创建&(*T)->rchild临时变量,传入CreateBiTree,构造右子树
34     }
35 }
36
37 class Solution {
38 public:
39      /**
40      * @param root: The root of binary tree.
41      * @return: True if this Binary tree is Balanced, or false.
42      */
43     int depth(TreeNode *root) {
44         if (root == NULL) {
45             return 0;
46         }
47         int left = depth(root->left);
48         int right = depth(root->right);
49         if (left == -1 || right == -1 || abs(left - right) > 1) {
50             return -1;
51         }
52         return max(left, right) + 1;
53     }
54     bool isBalanced(TreeNode *root) {
55         return depth(root) != -1;
56     }
57 };
58
59 //测试
60 int main()
61 {
62     Solution s;
63     TreeNode **pp;//定义指向BiTNode的二级指针pp
64     TreeNode *p;//定义指向BiTNode的指针p
65     pp=&p;//pp指向p
66     p=NULL;//初始化p指向NULL
67     CreateBiTree(pp);//传入指向p的地址,创建二叉树
68     cout<<s.depth(p);
69     cout<<endl;
70     cout<<s.isBalanced(p);
71 }

Python2.7版 spider测试通过:

 1 # -*- coding: utf-8 -*-
 2
 3 class TreeNode:
 4    def __init__(self,val,left,right):
 5        self.val=val
 6        self.left=left
 7        self.right=right
 8
 9 class Solution:
10     """
11     @param root: The root of binary tree.
12     @return: True if this Binary tree is Balanced, or false.
13     """
14     def isBalanced(self, root):
15         balanced, _ = self.validate(root)
16         return balanced
17
18     def validate(self, root):
19         if root is None:
20             return True, 0
21
22         balanced, leftHeight = self.validate(root.left)
23         if not balanced:
24             return False, 0
25         balanced, rightHeight = self.validate(root.right)
26         if not balanced:
27             return False, 0
28
29         return abs(leftHeight - rightHeight) <= 1, max(leftHeight, rightHeight) + 1
30
31 #测试
32 if __name__==‘__main__‘:
33    s=Solution()
34    node2=TreeNode(2,None,None)
35    node4=TreeNode(4,None,None)
36    node5=TreeNode(5,None,None)
37    node3=TreeNode(3,node4,node5)
38    root=TreeNode(1,node2,node3)
39    print s.validate(root)
40    print s.isBalanced(root)
时间: 2024-10-12 02:27:18

[容易]平衡二叉树的相关文章

大话数据结构—平衡二叉树(AVL树)

平衡二叉树(Self-Balancing Binary Search Tree/Height-Balanced Binary Search Tree),是一种二叉排序树,其中每一个节点的左子树和右子树的高度差至多等于1. 平衡二叉树的前提是二叉排序树,不是二叉排序树的都不是平衡二叉树. 平衡因子BF(Balance Factor):二叉树上节点的左子树深度减去右子树深度的值. 最小不平衡子树:距离插入节点最近的,且平衡因子的绝对值大于1的节点为根的子树. 下图中,新插入节点37时,距离它最近的平

Balanced Binary Tree(平衡二叉树)

来源:https://leetcode.com/problems/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 diff

平衡二叉树

1.基础知识 平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法),且具有以下性质:1.它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树.2.其高度一般都良好地维持在O(log2n),大大降低了操作的时间复杂度.3.平衡二叉树的常用算法有红黑树.AVL.Treap等. 4.最小二叉平衡树的节点的公式如下 F(n)=F(n-1)+F(n-2)+1 这个类似于一个递归的数列,可以参考Fibonacci数列,1是根节点,

数据结构—平衡二叉树

二叉排序树集中了数组的查找优势以及链表的插入.删除优势,因此在数据结构中占有一定的地位.但在一定的情况下二叉排序树又有可能变为链表,例如插入从1~100的数,这时进行数据查找的效率就要降低. 为了解决二叉排序树这种左右子树深度不均匀的情况引入了一种平衡二叉树(AVLTree):任何一个节点的左右子树深度差不超过1.通过这个限定,阻止了二叉树的左右子树深度差较大的情况,维持了二叉树的稳定. 如何让二叉树的左右子树深度差不超过1呢?这就需要对节点进行旋转,也就是当某个节点的左右子树深度超过1时需要对

二叉树的建立以及相关操作,平衡二叉树

二叉树的一些属性: int datdID;double data;TreeNode leftTree;TreeNode rightTree;TreeNode parent; //构建一个二叉树,将数据都放入了一个LIST里面    int selfID = 0;    public TreeNode creatTree(List<Double>datas,TreeNode tree){        if(datas.size()!=0){            TreeNode node =

平衡二叉树的构树过程

1 package testStudy; 2 /**平衡因子枚举类*/ 3 enum BalanceFactor{ 4 LH("左子树高"),EH("左右等高"),RH("右子树高"); 5 6 private String illustration=""; 7 8 private BalanceFactor(String s){ 9 this.illustration=s; 10 } 11 12 public String

数据结构与算法系列----平衡二叉树(AVL树)

一:背景 平衡二叉树(又称AVL树)是二叉查找树的一个进化体,由于二叉查找树不是严格的O(logN),所以引入一个具有平衡概念的二叉树,它的查找速度是O(logN).所以在学习平衡二叉树之前,读者需要了解二叉查找树的实现,具体链接:二叉查找树 那么平衡是什么意思?我们要求对于一棵二叉查找树 ,它的每一个节点的左右子树高度之差不超过1.(对于树的高度的约定:空节点高度是0:叶子节点高度是1.)例如下图: 如果我们的二叉查找树是不平衡该怎么办?进行旋转.经过分析发现,出现不平衡无外乎四种情况,下面我

数据结构例程——平衡二叉树

本文是[数据结构基础系列(8):查找]中第8课时[平衡二叉树]的例程. 平衡二叉树相关算法 #include <stdio.h> #include <malloc.h> typedef int KeyType; //定义关键字类型 typedef char InfoType; typedef struct node //记录类型 { KeyType key; //关键字项 int bf; //平衡因子 InfoType data; //其他数据域 struct node *lchi

图解平衡二叉树,AVL树(一)

图解平衡二叉树,AVL树(一) 学习过了二叉查找树,想必大家有遇到一个问题.例如,将一个数组{1,2,3,4}依次插入树的时候,形成了图1的情况.有建立树与没建立树对于数据的增删查改已经没有了任何帮助,反而增添了维护的成本.而只有建立的树如图2,才能够最大地体现二叉树的优点. 在上述的例子中,图2就是一棵平衡二叉树.科学家们提出平衡二叉树,就是为了让树的查找性能得到最大的体现(至少我是这样理解的,欢迎批评改正).下面进入今天的正题,平衡二叉树. AVL的定义 平衡二叉查找树:简称平衡二叉树.由前

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

题目:输入一棵二叉树的根结点,判断该树是不是平衡二叉树.某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵二叉树. 我们很容易就能想到一个代码简洁却性能不佳的思路:在遍历树的每个结点的时候,调用函数TreeDpth得到它的左右子树的深度.如果每个结点的左右子树的深度相差都不超过1,按照定义它就是一棵平衡的二又树. 较好的思路是:用后序遍历的方式遍历整棵二叉树.在遍历某结点的左右子结点之后,我们可以根据它的左右子结点的深度判断它是不是平衡的,并得到当前结点的深度.当最后遍历到树的根结点