二叉树的深度
struct BinaryTreeNode { int m_value; BinaryTreeNode *m_left; BinaryTreeNode *m_right; };
输入一颗二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。(出自:剑指offer)
如果一棵树只有一个结点,它的深度为1。如果根节点只有左子树而没有右子树,那么树的深度应该是左子树的深度加1;同样如果根节点只有右子树而没有左子树,那么树的深度应该是其右子树的深度加1.如果既有右子树又有左子树,那么该树的深度是其左右子树深度的较大值加1。
1 int TreeDepth( BinaryTreeNode * pRoot ) 2 { 3 if ( pRoot == NULL ) 4 { 5 return 0; 6 } 7 int left = TreeDepth( pRoot->m_left ); 8 int right = TreeDepth( pRoot->m_right ); 9 return ( left > right ) ? ( left + 1 ) : ( right + 1 ); 10 }
判断是否为平衡二叉树
输入一颗二叉树的根节点,判断是否是平衡二叉树。如果二叉树中任意的左右子树相差不超过1,那么它就是一颗平衡二叉树。
如果用后序遍历的方式遍历二叉树的每一个节点,在遍历到一个节点之前我们就已经遍历了它的左右子树。只要在遍历每个节点的时候记录它的深度,就可以一边遍历一边判断每个节点是不是平衡的。
bool IsBalanced( BinaryTreeNode *pRoot, int &depth ) { if ( pRoot == NULL ) { depth = 0; return true; } int left, right; if ( IsBalanced( pRoot->m_left, left ) && IsBalanced( pRoot->m_right, right ) ) { int diff = left - right; if ( diff >= -1 && diff <= 1 ) { depth = 1 + ( left > right ? left : right ); return true; } } return false; }