力扣刷题110、平衡二叉树

在这里插入图片描述
在这里插入图片描述

class Solution:
    def isBalanced(self, root: TreeNode) -> bool:
        def height(root:TreeNode)-> int:
            if not root:
                return 0
            leftHeight = height(root.left)
            rightHeight = height(root.right)
            if leftHeight == -1 or rightHeight == -1 or abs(leftHeight-rightHeight) > 1:
                return -1
            else :
                return max(leftHeight,rightHeight) + 1
        return height(root) >= 0

自顶而下的递归遍历整个二叉树
其中:

if leftHeight == -1 or rightHeight == -1 or abs(leftHeight-rightHeight) > 1:
    return -1

当满足abs(leftHeight-rightHeight) > 1,即二叉树的高度大于1,则返回-1,那么接下来会造成leftHeight 或者rightHeight 会为-1,那么一直会返回-1,到最后的return height(root) >= 0,就会返回false,即为不平衡二叉树。
二叉树的深度会因为return max(leftHeight,rightHeight) + 1这句,从下往上加深度。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
优化以下代码#include <stdio.h> #include <stdlib.h> typedef struct TreeNode { char data; struct TreeNode* left; struct TreeNode* right; } TreeNode; TreeNode* createTree() { char ch; TreeNode* root; scanf("%c", &ch); if (ch == '#') { return NULL; } root = (TreeNode*)malloc(sizeof(TreeNode)); root->data = ch; root->left = createTree(); root->right = createTree(); return root; } void digui(TreeNode* root) { if (root == NULL) { return; } digui(root->left); printf("%c ", root->data); digui(root->right); } typedef struct StackNode { TreeNode* tree; struct StackNode* next; } StackNode; typedef struct Stack { StackNode* top; int size; } Stack; Stack* createStack() { Stack* stack = (Stack*)malloc(sizeof(Stack)); stack->top = NULL; stack->size = 0; return stack; } void push(Stack* stack, TreeNode* tree) { StackNode* node; node = (StackNode*)malloc(sizeof(StackNode)); node->tree = tree; node->next = stack->top; stack->top = node; stack->size++; } TreeNode* pop(Stack* stack) { TreeNode* tree; StackNode* temp; if (stack->size == 0) { return NULL; } tree = stack->top->tree; temp = stack->top; stack->top = stack->top->next; stack->size--; free(temp); return tree; } void feidigui(TreeNode* root) { Stack* stack; TreeNode* p; stack = createStack(); p = root; while (p != NULL || stack->size != 0) { while (p != NULL) { push(stack, p); p = p->left; } if (stack->size != 0) { p = pop(stack); printf("%c ", p->data); p = p->right; } } } int getHeight(TreeNode* root) { int leftHeight,rightHeight,max; if (root == NULL) { return 0; } leftHeight = getHeight(root->left); rightHeight = getHeight(root->right); max=leftHeight>rightHeight?leftHeight:rightHeight; return max+1; }
06-03
首先,这段代码的缩进不太规范,可以调整一下,使得代码更加清晰易读。 其次,在函数中出现了多次重复的代码,如创建栈、入栈、出栈等,可以将这些代码封装成一个通用的函数,以便在程序中反复使用。 最后,可以考虑使用更加简洁的写法,如使用三目运算符代替if-else语句,使用递归函数代替while循环等,以提高代码的可读性和可维护性。同时,可以加上注释,方便他人理解代码逻辑。 下面是一个优化后的代码示例: ``` #include <stdio.h> #include <stdlib.h> typedef struct TreeNode { char data; struct TreeNode *left; struct TreeNode *right; } TreeNode; // 创建二叉树 TreeNode* createTree() { char ch; scanf("%c", &ch); if (ch == '#') { return NULL; } TreeNode *root = (TreeNode*)malloc(sizeof(TreeNode)); root->data = ch; root->left = createTree(); root->right = createTree(); return root; } // 递归遍历二叉树 void digui(TreeNode *root) { if (root == NULL) { return; } digui(root->left); printf("%c ", root->data); digui(root->right); } typedef struct StackNode { TreeNode *tree; struct StackNode *next; } StackNode; typedef struct Stack { StackNode *top; int size; } Stack; // 创建栈 Stack* createStack() { Stack *stack = (Stack*)malloc(sizeof(Stack)); stack->top = NULL; stack->size = 0; return stack; } // 入栈 void push(Stack *stack, TreeNode *tree) { StackNode *node = (StackNode*)malloc(sizeof(StackNode)); node->tree = tree; node->next = stack->top; stack->top = node; stack->size++; } // 出栈 TreeNode* pop(Stack *stack) { if (stack->size == 0) { return NULL; } TreeNode *tree = stack->top->tree; StackNode *temp = stack->top; stack->top = stack->top->next; stack->size--; free(temp); return tree; } // 非递归遍历二叉树 void feidigui(TreeNode *root) { Stack *stack = createStack(); TreeNode *p = root; while (p != NULL || stack->size != 0) { if (p != NULL) { push(stack, p); p = p->left; } else { p = pop(stack); printf("%c ", p->data); p = p->right; } } } // 获取二叉树的高度 int getHeight(TreeNode *root) { if (root == NULL) { return 0; } int leftHeight = getHeight(root->left); int rightHeight = getHeight(root->right); return leftHeight > rightHeight ? leftHeight + 1 : rightHeight + 1; } int main() { TreeNode *root = createTree(); digui(root); printf("\n"); feidigui(root); printf("\n"); printf("%d\n", getHeight(root)); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值