(转)二叉树分类

转自:http://blog.csdn.net/brillianteagle/article/details/39118937

一、完全二叉树的判断

参考:http://blog.csdn.net/lilypp/article/details/6158699/

【分析】根节点开始进行层次遍历,节点入队列,如果队列不为空,循环。遇到第一个没有左儿子或者右儿子的节点,设置标志位,如果之后再遇到有左/右儿子的节点,那么这不是一颗完全二叉树。

[java] view plaincopy

  1. /*使用LinkedList实现队列,入队使用queue.offer(),出队使用queue.poll()*/
  2. Queue<BinaryTreeNode<T>> queue=new LinkedList<>();
  3. boolean flag=true;
  4. queue.offer(root);
  5. while (!queue.isEmpty()) {
  6. BinaryTreeNode<T> tempNode=queue.poll();
  7. if (tempNode.getLeftChild()!=null&&flag){
  8. queue.offer(tempNode.getLeftChild());
  9. }else if (tempNode.getLeftChild()!=null) {
  10. return false;
  11. }else {
  12. flag=false;
  13. }
  14. if (tempNode.getRightChild()!=null&&flag){
  15. queue.offer(tempNode.getRightChild());
  16. }else if (tempNode.getRightChild()!=null) {
  17. return false;
  18. }else {
  19. flag=false;
  20. }
  21. }
  22. /*如果遍历完成仍然没有返回false,表明是完全二叉树*/
  23. return true;
  24. }

二、平衡二叉树的判断

【分析-1】从root开始往下递归判断节点的左右子树的深度差(动态规划问题,但不容易加入备忘机制,所以比较低效) 。子树的深度被重复计算,所以比较低效。

/*递归判断左右子树的深度,如果深度差的绝对值大于1表明非平衡树*/

[java] view plaincopy

  1. public  int isBalancedTree(BinaryTreeNode<T> node) {
  2. if (node==null) {
  3. return 1;
  4. }
  5. int leftDepth=getTreeDeep(node.getLeftChild());
  6. int rightDepth=getTreeDeep(node.getRightChild());
  7. int diff=leftDepth-rightDepth;
  8. if (diff<-1||diff>1) {
  9. return 0;
  10. }else {
  11. if (isBalancedTree(node.getLeftChild())==1&&isBalancedTree(node.getRightChild())==1){
  12. return 1;
  13. }else {
  14. return 0;
  15. }
  16. }
  17. }
  18. /* 获得树的高度,递归过程 */
  19. private int getTreeDeep(BinaryTreeNode<T> root) {
  20. if (root == null) {
  21. return 0;
  22. }
  23. if (root.getLeftChild() == null && root.getRightChild() == null) {
  24. return 1;
  25. }
  26. return 1 + Math.max(getTreeDeep(root.getLeftChild()),
  27. getTreeDeep(root.getRightChild()));
  28. }

【分析-2】利用动态规划的方法从底向上计算每个子数的深度。从顶向下递归传递一个Depth 对象,探底之后就从底向上开始计算,本质上是后续遍历。这里要注意,Depth depth需要传址调用,所以不能用int或Interger,而要新定义一个类。

[java] view plaincopy

  1. /*isBalancedTree(node.getLeftChild(),leftDepth)&&isBalancedTree(node.getRightChild(),rightDepth)表明先左边探底,然后上移一个节点计算右子数,是后续遍历过程*/
  2. public boolean isBalancedTree(BinaryTreeNode<T> node,Depth depth){
  3. if (node==null) {
  4. depth=new Depth(0);
  5. return true;
  6. }
  7. Depth leftDepth=new Depth(0),rightDepth=new Depth(0);
  8. if (isBalancedTree(node.getLeftChild(),leftDepth)&&isBalancedTree(node.getRightChild(),rightDepth)){
  9. int diff=leftDepth.getDepth()-rightDepth.getDepth();
  10. if (diff<=1&&diff>=-1) {
  11. depth.setDepth(1 + Math.max(leftDepth.getDepth(),rightDepth.getDepth()));
  12. System.out.println(depth.getDepth());
  13. return true;
  14. }
  15. }
  16. return false;
  17. }
  18. public boolean isBalancedTree(){
  19. return isBalancedTree(root, new Depth(0));
  20. }
  21. class Depth{
  22. int depth;
  23. public Depth(int depth) {
  24. // TODO 自动生成的构造函数存根
  25. this.depth=depth;
  26. }
  27. public int getDepth() {
  28. return depth;
  29. }
  30. public void setDepth(int depth) {
  31. this.depth = depth;
  32. }
  33. }

三、二叉搜索树(BST)的判断

参考:http://www.2cto.com/kf/201310/250996.html

【分析】BST的中序遍历是递增数列,所以可以利用中序遍历来进行判断。这里也是递归调用,需要传址调用,所以不能用int或Interger来定义pre。

先设计一个类:

[java] view plaincopy

  1. class Pre{
  2. int pre;
  3. public int getPre() {
  4. return pre;
  5. }
  6. public void setPre(int pre) {
  7. this.pre = pre;
  8. }
  9. }

函数体:

[java] view plaincopy

    1. public staticbooleanisBST(BinarySearchTreesNode<String> root) {
    2. Prepre=new Pre();
    3. pre.setPre(Integer.MIN_VALUE);
    4. return isBSTOrder(root, pre);
    5. }
    6. public static booleanisBSTOrder(BinarySearchTreesNode<String> root,Pre pre) {
    7. if (root==null) {
    8. return true;
    9. }
    10. if (isBSTOrder(root.getLeftChild(), pre)) {
    11. if (root.getKey()>pre.getPre()) {
    12. pre.setPre(root.getKey());
    13. return isBSTOrder(root.getRightChild(), pre);
    14. }else {
    15. return false;
    16. }
    17. }
    18. return false;
    19. }
时间: 2024-08-07 10:54:46

(转)二叉树分类的相关文章

关于二叉树的常见题型

一.二叉树相关概念 1.1 基本术语 结点的度:一个结点的子结点的个数称为结点的度. 树的度:树中结点的最大度数为树的度 树的深度(高度):树中结点的最大层数,从1开始. 1.2 二叉树分类 满二叉树:一颗高度为h,并且含有2^h-1个结点的二叉树称为满二叉树.即树中每一层都含有最多的节点.除叶子节点每个节点的度都为2. 完全二叉树:当高度为h,具有n个结点的二叉树,与高度为h的满二叉树结点编号完全对应时,即为完全二叉树.(若存在度为1的节点,只能有一个,且只有左孩子无右孩子) 二叉排序树:左子

完全二叉树和满二叉树的区别

二叉树分类很多,其中满二叉树和完全二叉树又有点特殊,这两种二叉树的效率又有点高,以下是它们的区别: 满二叉树:从形象来看的话满二叉树是一个绝对的三角形,最后一层全部是叶子节点,其它各层是非叶子节点,节点数的计算n=2^k - 1,k表示深度,也就是层数,第i层的节点数n= 2^(i- 1),它的节点数是一系列固定的数,如果节点数不是序列中的数的话,就不是满二叉树. 完全二叉树:完全二叉树的节点数是任意的,从形式上讲它是个缺失的的三角形,但所缺失的部分一定是右下角某个连续的部分,最后那一行可能不是

java数据结构和算法10(堆)

这篇我们说说堆这种数据结构,其实到这里就暂时把java的数据结构告一段落,感觉说的也差不多了,各种常见的数据结构都说到了,其实还有一种数据结构是"图",然而暂时对图没啥兴趣,等有兴趣的再说:还有排序算法,emmm....有时间再看看吧! 其实从写数据结构开始到现在让我最大的感触就是:新手刚开始还是不要看数据结构为好,太无聊太枯燥了,很容易让人放弃:可以等用的各种框架用得差不多了之后,再回头静下心来搞搞数据结构还是挺有趣的:废话不多说,开始今天的内容: 1.二叉树分类 树分为二叉树和多叉

重构二叉树

重构二叉树 这是剑指offer中关于二叉树重构的一道题.题目原型为: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. 一.二叉树的数据结构 做题之前,我们先熟悉下二叉树的数据结构.其一,定义:二叉树是一个连通的无环图,并且每一个顶点的度不大于3.有根二叉树还要满足根结点的度不大于2.有了根结点之后,每个顶点定

数据结构学习笔记(树、二叉树)

树(一对多的数据结构) 树(Tree)是n(n>=0)个结点的有限集.n=0时称为空树.在任意一颗非空树种: (1)有且仅有一个特定的称为根(Root)的结点: (2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1.T2........Tn,其中每一个集合本身又是一棵树,并且称为根的子树. 对于树的定义还需要强调两点:1.n>0时根结点是唯一的,不可能存在多个根结点,数据结构中的树只能有一个根结点.2.m>0时,子树的个数没有限制,但它们一定是互不相交的. 结点

杭电ACM分类

杭电ACM分类: 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze 广度搜索1006 Redraiment猜想 数论:容斥定理1007 童年生活二三事 递推题1008 University 简单hash1009 目标柏林 简单模拟题1010 Rails 模拟题(堆栈)1011 Box of Bricks 简单题1012 IMMEDIATE DECODABILITY

c++简单实现二叉树

专业术语: 节点 父节点 根节点 子孙 堂兄弟 深度: 从根节点到最底层节点的层数称为深度 叶子节点: 没有子节点的节点称为叶子节点 非终端节点: 实际就是非叶子节点 度: 子节点的个数称为度 树的分类: 一般树 任意一个节点的子节点个数都不受限制 二叉树 任意一个节点的子节点的个数最多是两个 且子节点的位置不可更改 分类: 一般二叉树 满二叉树 在不添加树的层数的情况下每个子节点都满了不能再多一个节点 完全二叉树 如果只删除了满二叉树最底层最右边的连续若干个节点这样形成的二叉树就是完全二叉树

数据结构 1、概述 特性、分类、复杂性分析

数据结构是描述非数值计算再实体中的数学模型以及在计算机中的表示方法,以及这些模型进行的操作如何在计算机中中进行操作 基本概念: 数据:所有能被输入到计算机中,且能被计算机处理的符号的集合---是计算机操作对象的总称 数据结构的逻辑组织 线性结构:线性表(表.栈.队列.串等) 非线性结构:  树(二叉树,Huffman树,二叉索引树等) 图(有向图,无向图等) 图>树>二叉树>线形图     (>包含) 数据结构的存储结构 逻辑结构到物理内存的映射 四类:顺序(存储单元的顺序地址)

树和二叉树知识点总结

参考资料 <数据结构(c语言版)> http://www.cnblogs.com/huangxincheng/archive/2012/07/21/2602375.html (系列文章) http://www.cnblogs.com/sunysen/p/3201503.html(系列文章) 一.基本概念 树的定义 树状图是一种数据结构,它是由n(n>=1)个有限结点组成一个具有层次关系的集合.把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的.它具有以下的特点: