标签:二叉树深度
题目一:输入一棵二叉树的根结点,求该树的深度。从根结点到叶子结点依次经过的结点形成一条路径,最长路径的长度为树的深度。二叉树的结点定义如下:
struct BinaryTreeNode { int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* n_pRight; };
分析:二叉树的深度等于根结点的左子树和右子树之中深度最大的一个加1,明显这是一个递归过程。实现如下:
int TreeDepth(BinaryTreeNode* pRoot) { if(pRoot==NULL) return 0; int nLeft=TreeDepth(pRoot->m_pLeft); int nRight=TreeDepth(pRoot->m_pRight); return (nLeft>nRight)?(nLeft+1):(nRight+1); }
题目二:输入一个二叉树的根结点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。
分析:根据题目一的方案可以得到以下实现方式:
bool IsBalanced(BinaryTreeNode* pRoot) { if(pRoot==NULL) return true; int left=TreeDepth(pRoot->m_pLeft); int right=TreeDepth(pRoot->m_pRight); int diff=left=right; if(diff>1||diff<-1) return false; return IsBalanced(pRoot->m_pLeft)&&IsBalanced(pRoot->m_pRight); }
上述实现虽然简单,但是注意到由于每个结点会被重复遍历多次,这种思路的时间效率不高。我们在遍历的时候记录深度就可以了。实现如下:
bool IsBalanced(BinaryTreeNode* pRoot,int* pDepth) { if(pRoot==NULL) { *pDepth=0; return true; } int left,right; if(IsBalanced(pRoot->m_pLeft,&left)&&IsBalanced(pRoot->m_pRight,&right)) { int diff=left-right; if(diff<=1&&diff>=-1) { *pDepth=1+(left>right?left:right); return true; } } return false; } bool IsBalanced(BinaryTreeNode* pRoot) { int depth=0; return IsBalanced(pRoot,&depth); }
本文出自 “仙路千叠惊尘梦” 博客,请务必保留此出处http://secondscript.blog.51cto.com/9370042/1587778
标签:二叉树深度
原文地址:http://secondscript.blog.51cto.com/9370042/1587778