三:求二叉树的深度以及判断二叉树是否平衡

原创 2015年07月07日 13:20:55

求树的深度

int TreeDepth(BinaryTreeNode* pRoot) 

   if (pRoot == NULL) 

       return 0; 


   int nLeftDepth = TreeDepth(pRoot->m_pLeft); 

   int nRightDepth = TreeDepth(pRoot->m_pRight); 

 

    return(nLeftDepth>nRightDepth)?(nLeftDepth+1):(nRightDepth+1); 

 

判断是否为平衡二叉树

方法一:

bool IsBalanced(BinaryTreeNode* pRoot) 

   if(pRoot== NULL) 

       return true; 

 

   int nLeftDepth = TreeDepth(pRoot->m_pLeft); 

   int nRightDepth = TreeDepth(pRoot->m_pRight); 


   int diff = nRightDepth-nLeftDepth; 

 

   if (diff>1 || diff<-1) 

       return false; 

 

   returnIsBalanced(pRoot->m_pLeft)&&IsBalanced(pRoot->m_pRight); 

 

方法二:

由于上述方法在求该结点的的左右子树深度时遍历一遍树,再次判断子树的平衡性时又遍历一遍树结构,造成遍历多次。如果我们用后序遍历的方式遍历二叉树的每一个结点,在遍历到一个结点之前我们已经遍历了它的左右子树。只要在遍历每个结点的时候记录它的深度(某一结点的深度等于它到叶节点的路径的长度),我们就可以一边遍历一边判断每个结点是不是平衡的。

 

bool IsBalanced(BinaryTreeNode* pRoot, int*depth) 

    if(pRoot==NULL) 

    { 

        *depth =0; 

        returntrue; 

    } 

 

    int nLeftDepth,nRightDepth; 

    bool bLeft=IsBalanced(pRoot->m_pLeft, &nLeftDepth); 

    bool bRight= IsBalanced(pRoot->m_pRight, &nRightDepth); 

     

    if (bLeft&& bRight) 

    { 

        int diff= nRightDepth-nLeftDepth; 

        if(diff<=1 || diff>=-1) 

        { 

           *depth = 1+(nLeftDepth > nRightDepth ? nLeftDepth :nRightDepth); 

           return true; 

        } 

    } 

     

    returnfalse; 

 

bool CallIsBalanced(BinaryTreeNode* pRoot) 

    int depth =0; 

 

    returnIsBalanced(pRoot, &depth); 

}  

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

二叉树的深度求值和判断是否是平衡

#ifndef BINTREE_H #define BINTREE_H #include #include #include using namespace std; template ...

求二叉树深度、判断是否是平衡二叉树

求二叉树深度:递归的方法:从根节点按照先序顺序遍历二叉树,返回左子树和右子树中较大的深度,再加上1就是根节点的深度。C++代码实现:typedef struct TreeNode{ int d...

剑指offer 39. 二叉树的深度和判断是否为平衡二叉树

class TreeNode{ int data; TreeNode left; TreeNode right; } //题目1:输入二叉树的根节点,返回数的最大深度 public class...

二叉树的深度,判断是否是平衡二叉树

二叉树的深度,判断是否是平衡二叉树

求二叉树的深度,判断该树是不是平衡二叉树

剑指offer两道编程题二叉树深度 输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。 求二叉树的深度,有三种方法: 1. **...

二叉查找树-平衡二叉树-红黑树-B树的深度对比分析

我们这个专题介绍的动态查找树主要有: 二叉查找树(BST),平衡二叉查找树(AVL),红黑树(RBT),B~/B+树(B-tree)。这四种树都具备下面几个优势: (1) 都是动态结构。在删除,插入...

【数据结构】中判断一棵树是否为平衡二叉树

【数据结构】中判断一棵树是否为平衡二叉树

《剑指offer》:[39-1]判断是否为平衡二叉树

题目:输入一棵二叉树的结点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。 上图中的二叉树就是一棵平衡二叉树。 分析:有了求二叉树深度的思...
  • gogoky
  • gogoky
  • 2016-06-19 16:02
  • 1229

判断是否为平衡二叉树

平衡二叉树对于查询效率的优化有重要意义,这次问题是输入一颗二叉树,判断该树是否为平衡二叉树。 我最开始理解的二叉树其实就是最大高度和最小高度差值小于或则等于1。并用代码实现出来: 1、分别找到树的...

java算法10~判断是否为平衡二叉树

概念:平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它                        ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)