树的基本操作(一)

来源:互联网 发布:算法统宗 古题 编辑:程序博客网 时间:2024/06/04 19:03

一丶树的高度:给定一个二叉树的根节点,返回该二叉树的高度


        图1-1树的结构示例

树的高度定义为树的根节点到最叶子节点的最长路径,在上图1-1所示的树结构中,最长路径是1-3-6-7,该路径有四个节点,所以树的高度为4。在上述的定义下,在利用代码求解树的高度过程中,特别是在一个树的结构非常复杂的时候,直接求解树的最长路径是比较复杂的。

但是我们不难发现一个特点,当树的结构十分简单的时候,比如仅有一个节点的时候,依据定义,那么该树的高度是1。所以将一个结构复杂的树的高度求解问题,转换成结构简单的树的高度求解问题是努力的方向,像这种缩小问题规模,状态转移的思路,可以利用动态规划的算法实现,对于动态规划算法而言,寻找一个合适的状态转移方程是解决问题的关键。

                                                                                     

                                                     图1-2左子树                               图1-3右子树

以图1-1为例子,该树的高度是不难看出是4,图1-2是其的左子树,其高度不难看出是2,图1-3是其的右子树,其高度不难看出是3。

如果仔细的思考下,不难的得出如下状态转移关系:

树的高度 = max(左子树高度,右子树高度)+1;                            

图1-2和图1-3代表的左右子树,可以利用该状态转移关系,一直计算下去,直到最后缩小成只有一个节点的子树。下图是java代码的实现,利用尾递归的方式来实现该状态转移方程。

public int getHeight(TreeNode root){if(root==null){return 0;}return Math.max(root.left,root.right)+1;}

二.树的平衡性判断:给定一个二叉树的根节点,如何判断该二叉树是不是平衡二叉树树

平衡二叉树,是二叉树结构的一种特殊的形态,它定义该二叉树的各个节点的左右子树的高度相差不超过1。

                                                

                     图2-1 非平衡二叉树                                                                        图2-2 平衡二叉树

对于图2-1所示的二叉树而言,其不是平衡二叉树,虽然根节点的左右子树的高度相差不超过1,但是节点3的左右子树的高度不满足要求。图2-2所示的二叉树就是平衡二叉树,其各个节点都满足平衡性要求。

在熟悉了平衡二叉树的定义后,我们知道一个平衡二叉树,不仅是根节点需要满足平衡性要求,其各个子节点都需要满足平衡性需求,这是一个递归的定义。

从上,可以归纳出判断一颗二叉树是否是平衡二叉树的思路如下:

1.判断root==null,空节点默认是平衡二叉树,为空返回true,非空跳到步骤2。

2.root!=null,判断左子树root.left高度,和右子树root.right高度:如果不满足平衡性返回true,如果满足则递归判断左子树和右子树是否同样满足平衡性。

判断平衡性的java实现代码如下:

public void boolean isBalanced(TreeNodenode){      if(node==null) return true;      if(Math.abs(getHeight(node.left)-getHeight(node.left))>1)           return false;      return isBalanced(node.left)&&isBalaced(node.right);}