1 树的高度和深度
1.1 高度
对于高度,就像楼房,问你一幢楼有多高?
然后,你就从下往上一层一层的数。树也是根据习惯,从下往上数的。
还有一个问题,对于楼房,地面上的一层是第一层,然后依次往上是第二层、第三次。。。
对于树,最下面的叶子节点是指第一层吗?先看看树高度的定义:
树某个节点x的高度;
高度:从结点x向下到某个叶结点最长简单路径中边的条数。
这个定义有两点需要注意:1、最长简单路径 2,高度就是边的条数
G节点高度是多少呢?
有两条路径:G-l, G-M-O,选哪个呢?
最长简单路径: G-M-O
高度就是边的条数:两条
回到刚开始的问题,最下面的叶子节点是指第一层吗?答案不是,最下面的叶子节点是第0层
1.2 深度
对于深度,问你一口经有多深?
你往井里望一望,视角是往下。
所以呢,对于树的深度,也是从上往下数的。
根节点的深度是0.
二叉树的深度,递归实现:
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def TreeDepth(self, pRoot):
# write code here
if not pRoot:
return 0
else:
leftx = self.TreeDepth(pRoot.left)+1
rightx = self.TreeDepth(pRoot.right) + 1
maxx = max(leftx,rightx)
return maxx
2 二叉排序树bst
二叉排序树(Binary Sort Tree)又称二叉查找树。它或是一颗空树,或者具有以下性质的二叉树:
1、若左子树不为空,则左子树上所有节点的值均小于根节点的值
2、若右子树不为空,则右子树上所有节点的值均大于根节点的值
3、左右子树也分别为二叉排序树
2 平衡二叉树AVL
平衡二叉树:它或者是一颗空树,或者具有以下性质的二叉树:
它的左子树和右子树的深度之差(平衡因子)的绝对值不超过1
且它的左子树和右子树都是一颗平衡二叉树
判断是否是平衡二叉树:
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def IsBalanced_Solution(self, pRoot):
# write code here
return self.balancedheight(pRoot)>=0
def balancedheight(self,pRoot):
if not pRoot:
return 0
else:
left = self.balancedheight(pRoot.left)
right = self.balancedheight(pRoot.right)
if left <0 or right <0 or abs(left-right)>1:
return -1
else:
return max(left,right) + 1