BinaryTree的高度求解及平衡树判断
来源:互联网 发布:早产儿生长曲线图软件 编辑:程序博客网 时间:2024/03/28 16:43
BinaryTree 的高度指其根到叶子结点路径中最长的距离 比如如下binarytree:
2
3 1
4 2 3 5
6 7
9
从2到9要经历2-1-5-7-9 5个节点(包括root) 所以其高度为5
也可以解释成一个节点的高度,等于其左右子树中高度较高的那一支的高度+1(因为多了一个节点)
第二种理解对于程序求解高度较为方便。具体实现中使用递归,求解每个子结点的高度,并递归到根节点,根节点高度去子结点高度较大的一个并加1. 最后root节点返回的高度值既为binarytree的高度。其中当当前节点为空时,返回0;
此方法遍历binarytree每个节点,复杂度为O(N)
Java 代码如下:
public int getHeight(Node root){if(root==null){return 0;}else if(getHeight(root.left)>=getHeight(root.right)){return getHeight(root.left)+1;}else return getHeight(root.right)+1;}
同理,当每个节点高度可求时,即可判断平衡树。
平衡树定义为对于每个节点,子树的高度差不大于1.所以通过遍历每个节点的左右节点,并判断高度差即可判断该树是否为平衡树。
public boolean isBalanceTree(Node root){/* * For getHeight function the first level nodes call for N times with N nodes to calculate height * The second level nodes call N/2 order times with N/2 order nodes in each subtree and 2 roots * The n level nodes call N/2^(N-1)order times with N/2^(N-1) order nodes in 2^(N-1) roots * So there are N calls in each level * For N input size, there are logN levels. So the time complexity is O(NlogN). */if(root==null){return true;}int diff=Math.abs(getHeight(root.left)-getHeight(root.right));if (diff>1){return false;}else return isBalanceTree(root.left)&&isBalanceTree(root.right);}
其复杂度为O(N*logN),自行推导如上(并不一定准确。。。)
然后发现在ctci上有另一种O(N)的算法:
因为在求每个节点的高度的时候都要求其左右子结点的高度,因此可以在这个时候进行判断,如果存在大于1的,直接返回-1跳出即可。省去了外层判断函数的遍历过程
代码:
public int getTreeHeight(Node root){/* We determine the diff in calculate each node's height O(n) */if(root==null){return 0;}else{int heightLeft=getTreeHeight(root.left);if(heightLeft==-1){return -1;}int heightRight=getTreeHeight(root.right);if(heightRight==-1){return -1;}return Math.max(heightLeft, heightRight);}}
0 0
- BinaryTree的高度求解及平衡树判断
- 平衡二叉树计算高度的同时判断是否平衡
- 判断一棵树是否为平衡树及求树的高度
- BinaryTree(0).关于平衡二叉树的实现
- 判断二叉树是否平衡,计算树的高度
- LeetCode之判断高度平衡二叉树
- 高度平衡的二叉树
- BinaryTree的构建和遍历,以及搜索删除(非完全二叉树,非平衡二叉树)
- treeDepth求解树的高度
- Balanced Binary Tree 判断二叉树是否是高度相差不超过1的高度平衡的二叉树
- 平衡数的求解
- AVL(高度平衡的二叉树)
- 平衡二叉树的判断
- 平衡二叉树的判断
- 平衡二叉树的判断
- 平衡二叉树的判断
- 平衡二叉树的判断
- 平衡二叉树的判断
- xcode升级导致布局错位的导航栏适配
- usaco training 4.3.1 Buy Low, Buy Lower 题解
- WCF共享端口正确开启方法介绍
- radar nyoj 287
- Bootstrap使用入门
- BinaryTree的高度求解及平衡树判断
- 如何让textArea填充整个frame
- 在CentOS6.5下使用KVM虚拟机激活Win2008的关键步骤
- 一名优秀的C程序员
- 水仙花数
- AWK命令详解
- explicit构造函数的作用
- 小沈阳撞脸“都敏俊”金秀贤 娱乐圈明星撞脸对对碰
- 学习