力扣:110.平衡二叉树
代码随想录
题目:
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
递归思路:这个题目不是很好理解的
主体:在求高度的同时把问题顺便解决。
这个递归函数名为:求高度
解法:1+左孩子高度+右孩子高度
顺便的操作:假如左孩子高度与右孩子高度之差大于1那么返回-1。
顺便把问题解决这很巧妙,也不是这样说确切来说是:看似是次体又是主体,应该说两者都是主体。
解决问题是体现了求高度为主体,在大体上来看以及在过程中来看又体现了是否为平衡二叉树为主体。
做题时的思考方式:
第一步:在求高度的同时把问题顺便解决。
第二步:在写代码的同时关注题目问题。
代码:
class Solution {
public:
int getheight(TreeNode*root){
if(!root) return 0;
int lefth = getheight(root->left);
if(lefth == -1) return -1;
int righth = getheight(root->right);
if(righth == -1) return -1;
return abs(lefth-righth) > 1?-1:1+max(lefth,righth);
}
bool isBalanced(TreeNode* root) {
int a = getheight(root);
return a != -1;
}
};
迭代法:
①:用一个函数求高度。
②:另一个函数来判断每一个节点的左右两个子树的高度差的绝对值不超过 1 。
通过递归或者层序遍历求①,通过栈或队列遍历每一个元素然后判断左右孩子高度差即可。
代码:
class Solution {
private:
int getDepth(TreeNode* cur) {
stack<TreeNode*> st;
if (cur != NULL) st.push(cur);
int depth = 0; // 记录深度
int result = 0;
while (!st.empty()) {
TreeNode* node = st.top();
if (node != NULL) {
st.pop();
st.push(node); // 中
st.push(NULL);
depth++;
if (node->right) st.push(node->right); // 右
if (node->left) st.push(node->left); // 左
} else {
st.pop();
node = st.top();
st.pop();
depth--;
}
result = result > depth ? result : depth;
}
return result;
}
public:
bool isBalanced(TreeNode* root) {
stack<TreeNode*> st;
if (root == NULL) return true;
st.push(root);
while (!st.empty()) {
TreeNode* node = st.top(); // 中
st.pop();
if (abs(getDepth(node->left) - getDepth(node->right)) > 1) {
return false;
}
if (node->right) st.push(node->right); // 右(空节点不入栈)
if (node->left) st.push(node->left); // 左(空节点不入栈)
}
return true;
}
};
二叉树节点的深度:从最上面一层到该节点的深度。(指从根节点到该节点的最长简单路径边的条数。)
二叉树节点的高度:从底部一层到该节点一层的高度。(指从该节点到叶子节点的最长简单路径边的条数。)
因为求深度可以从上到下去查 所以需要前序遍历(中左右),而高度只能从下到上去查,所以只能后序遍历(左右中)。