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;
}
之前写过的有错误就一直搁置了,因为自己没有用例可测只一次次修改后直接提交让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 179 Largest Number
- leetcode 24 Swap Nodes in Pairs
- leetcode 2 Add Two Numbers 方法1
- leetcode 2 Add Two Numbers 方法2
- leetcode----Longest Substring Without Repeating Characters
- [LeetCode]47 Permutations II
- [LeetCode]65 Valid Number
- [LeetCode]123 Best Time to Buy and Sell Stock III
- [LeetCode] String Reorder Distance Apart
- [LeetCode] Sliding Window Maximum
- [LeetCode] Find the k-th Smallest Element in the Union of Two Sorted Arrays
- [LeetCode] Determine If Two Rectangles Overlap
- [LeetCode] A Distance Maximizing Problem
- leetcode_linearList
- leetcode_linearList02
- 021-Merge Two Sorted Lists(合并两个排好序的单链表);leetcode
- LeetCode[Day 1] Two Sum 题解
- LeetCode[Day 2] Median of Two Sorted Arrays 题解
- LeetCode[Day 3] Longest Substring Without... 题解
- LeetCode [Day 4] Add Two Numbers 题解