面试题39:二叉树的深度
题目一:输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点一次经过的节点形成树的一条路径,最长路径的长度为树的深度。
二叉树的节点定义如下:
struct TreeNode { int val; TreeNode* left; TreeNode* right; };
例如,下图中二叉树的深度为4.
1 int depthOfTree(TreeNode* root) { 2 if ( root == NULL ) 3 return 0; 4 else 5 return 1+max(depthOfTree(root->left), depthOfTree(root->right)); 6 }
题目二:输入一棵二叉树的根节点,判断该树是不是平衡二叉树。
解法一:需要重复遍历节点多次,简单但不足以打动面试官
利用题目一依次计算计算每个节点的深度。
1 bool isBalanced(TreeNode* root) { 2 if ( root == NULL ) 3 return true; 4 if ( abs(depthOfTree(root->left)-depthOfTree(root->right)) > 1 ) 5 return false; 6 else 7 return isBalanced( root->left ) && isBalanced( root->right ); 8 }
解法二:一边遍历一边记录节点深度
1 bool isBalanced(TreeNode* root, int & depth) 2 { 3 if (root == NULL) 4 { 5 depth = 0; 6 return true; 7 } 8 int left, right; 9 if (isBalanced(root->left, left) && isBalanced(root->right,right)) 10 { 11 if (abs(left-right)<=1) 12 { 13 depth = max(left,right)+1; 14 return true; 15 } 16 } 17 return false; 18 } 19 bool isBalanced(TreeNode* root) { 20 int depth = 0; 21 return isBalanced(root, depth); 22 }