您的位置:首页 > 其它

110-e-Balanced Binary Tree

2016-03-24 16:41 295 查看
判断是否是平衡二叉树,即左右子树高度差不大于1,子树同样。

之前写过的有错误就一直搁置了,因为自己没有用例可测只一次次修改后直接提交让leet来帮测(其实是自己懒写二叉树的构造遍历等等一些列函数所以构造不出二叉树来测试,没有输入当然也就无法debug)。

重写时在求node的depth有思路想了很久但就是没实现,那感觉就像all most there但就是到不了there,纠结后还是参考了网络。所以说数据结构确实得多练练。

AC代码如下:

int getNodeDepth (struct TreeNode *node, int depth, int dleft, int dright) {
if (node == NULL)
return depth;

dleft = getNodeDepth(node->left, depth + 1, dleft, dright);
dright = getNodeDepth(node->right, depth + 1, dleft, dright);

if (dleft < dright)
return dright;
else
return dleft;
}
bool traverseBalanceTree(struct TreeNode *node, int level, int *dpLeft, int *dpRight) {
if (node == NULL)
return true;

// 可以仔细体会下遍历函数在2种不同位置下的区别,上面的是先遍历到左根节点再层层上移算depth相当于左中右中序遍历,下面的是先算root的depth再层层下移相当于中左右左序遍历。提交时前者耗时高达200ms,后者只8ms,性能相差巨大。原因应该是既然是算平衡二叉树那肯定从枝叶最多的node开始算,那就是root了。前者是从叶子回退,相当于要计算很多个小树是否平衡,效率自然低下不少。

int l = 0;
// traverseBalanceTree(node->left, level + 1, dpLeft, dpRight);
int dl = 0, dr = 0;
l = getNodeDepth(node->left, 1, dl, dr);

int r = 0;
// traverseBalanceTree(node->right, level + 1, dpLeft, dpRight);
dl = 0, dr = 0;
r = getNodeDepth(node->right, 1, dl, dr);

if (l - r > 1 || l - r < -1) {
*dpLeft = 0;
return false;
}

traverseBalanceTree(node->left, level + 1, dpLeft, dpRight);
traverseBalanceTree(node->right, level + 1, dpLeft, dpRight);

return *dpLeft;
}
bool isBalanced(struct TreeNode *root) {
if (root == NULL)
return true;

bool result = true;
int level = 1, dpLeft = 1, dpRight = 1;

result = traverseBalanceTree(root, level, &dpLeft, &dpRight);

return result;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode