二叉树的深度以及判断二叉树是否为平衡二叉树
2017-08-10 16:53
375 查看
二叉树的深度
题目:输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
基本思想:
我们假定Tree的节点个数为GetTreeNodeNum(),其左子树为LeftTree,右子树为RightTree。那么求Tree的深度有以下几种情况:
GetTreeNodeNum()==1&&LeftTree==NULL&&RightTree==NULL 则Tree的深度depth=1.
GetTreeNodeNum()>1&&LeftTree!=NULL&&RightTree==NULL 则Tree的深度depth=GetDepth(LeftTree)+1.
GetTreeNodeNum()>1&&LeftTree==NULL&&RightTree!=NULL 则Tree的深度depth=GetDepth(RightTree)+1.
GetTreeNodeNum()>1&&LeftTree!=NULL&&RightTree!=NULL 则Tree的深度depth= Max(GetDepth(RightTree),GetDepth(LeftTree))+1.
综上,代码如下:
//递归版本 int TreeDepth(TreeNode* pRoot) { if(pRoot==NULL) return 0; int nLeft=TreeDepth(pRoot->left); int nRight=TreeDepth(pRoot->right); return (nLeft>nRight)?nLeft+1:nRight+1; } //非递归版本 int TreeDepth(TreeNode* pRoot) { if(pRoot==NULL) return 0; queue<TreeNode *> q; q.push(pRoot); int depth=0; while(!q.empty()){ int len=q.size(); depth++; while(len--){ TreeNode *tmp=q.front(); q.pop(); if(tmp->left) q.push(tmp->left); if(tmp->right) q.push(tmp->right); } } return depth; }
树是否为平衡二叉树
题目:输入一棵二叉树,判断该二叉树是否是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一颗平衡二叉树。
解法1:
有了求二叉树的深度的代码之后,我们知道求解一个树是否为平衡二叉树,其实就是在遍历每一个节点的时候,判断其左右子树的深度的差值是否超过1,如果每个节点都满足平衡的条件,则返回true。代码如下:bool isBalanced(TreeNode *pRoot){ if(pRoot==NULL) return true; int left=TreeDepth(pRoot->left); int right=TreeDepth(pRoot->right); int dif=left-right; if(dif>1||dif<-1) return false; return isBalanced(pRoot->left)&&isBalanced(pRoot->right); }
解法2
解法1存在着重复遍历节点多次的缺陷。例如在判断根节点是否是平衡的时候,会依次遍历左右子树一遍。如果平衡,继续遍历根节点左右子树的时候,又会重复遍历在判断根节点平衡时遍历过的节点。故我们可以改用后序遍历的方式来遍历二叉树的每一个节点,这样在遍历一个节点的时候,我们已经遍历了其左右子树,那么我们可以在遍历左右子树的时候记录其结点的深度,那么我们可以一边遍历一边判断每个节点是否是平衡的。代码如下:
bool IsBalanced_Solution(TreeNode* pRoot) { int depth=0; return IsBanlanced(pRoot,&depth); } bool IsBanlanced(TreeNode* pRoot, int* pDepth) { if(pRoot==NULL) { *pDepth=0; return true; } int left,right; if(IsBanlanced(pRoot->left,&left)&&IsBanlanced(pRoot->right,&right)) { int diff=left-right; if(diff<=1&&diff>=-1) { *pDepth=1+(left>right?left:right); return true; } } return false; }
相关文章推荐
- 39 二叉树的深度和宽度以及判断是否是平衡二叉树
- 每日一题之判断一棵二叉树是否是平衡二叉树以及求一颗二叉树的镜像
- 剑指offer 39-二叉树的深度 判断二叉树是否为平衡二叉树
- 每天一道LeetCode-----计算二叉树的最大深度及最小深度,判断二叉树是否是高度平衡二叉树
- 剑指Offer面试题39二叉树的深度(以及判断平衡二叉树),面试题40数组中只出现一次的数字
- 面试题39:获得二叉树深度和判断是否是平衡二叉树
- 剑指offer 面试题39 求二叉树深度|判断是否为平衡二叉树
- 计算二叉树的深度,判断二叉树是否是平衡二叉树
- 二叉树的深度以及判断平衡二叉树
- 【面试题】剑指Offer-39-求二叉树的深度和判断一颗树是否为平衡二叉树
- 二叉树的深度以及判断平衡二叉树
- 二叉树的深度,判断是否是平衡二叉树
- 剑指offer面试题39:二叉树深度以及判断平衡二叉树
- 求一个二叉树的深度以及如何判断一个二叉树是一个平衡二叉树
- 三:求二叉树的深度以及判断二叉树是否平衡
- 剑指offer 39. 二叉树的深度和判断是否为平衡二叉树
- 计算二叉树的深度+判断二叉树是否是平衡二叉树
- 【树】二叉树的深度 + 树的最小深度 + 判断是否为平衡二叉树
- 求二叉树深度、判断是否是平衡二叉树
- 判断二叉树是否为平衡二叉树