平衡二叉树判断、完全二叉树判断

平衡二叉树判断
完全二叉树判断

平衡二叉树判断
有一棵二叉树,请设计一个算法判断这棵二叉树是否为平衡二叉树。
给定二叉树的根结点root,请返回一个bool值,代表这棵树是否为平衡二叉树。
我的提交

-- coding:utf-8 --

class TreeNode:

def init(self, x):

self.val = x

self.left = None

self.right = None

class CheckBalance:
def getDepth(self, root):
if not root:
return 0
ldepth = self.getDepth(root.left)
rdepth = self.getDepth(root.right)
return max(ldepth, rdepth) + 1

def check(self, root):
    # write code here
    if not root:
        return True
    ldepth = self.getDepth(root.left)
    rdepth = self.getDepth(root.right)
    diff = abs(ldepth - rdepth)
    if diff > 1:
        return False
    return self.check(root.left) and self.check(root.right)

参考答案
/
struct TreeNode {
int val;
struct TreeNode
left;
struct TreeNode right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
/

class CheckBalance {
public:
int chk(TreeNode rt){
if(rt == NULL) return 0;
int l = chk(rt->left),r = chk(rt->right);
if(l < 0 || r < 0) return -1;
if(abs(r - l) > 1) return -1;
return r > l ? r + 1 : l + 1;
}
bool check(TreeNode
root) {
return chk(root) >= 0;
}
};
完全二叉树判断
有一棵二叉树,请设计一个算法判断它是否是完全二叉树。
给定二叉树的根结点root,请返回一个bool值代表它是否为完全二叉树。树的结点个数小于等于500
我的提交

-- coding:utf-8 --

class TreeNode:

def init(self, x):

self.val = x

self.left = None

self.right = None

class CheckCompletion:
def chk(self, root):

write code here

    if not root:
        return True
    queue = []
    stop = False
    queue.append(root)
    while queue:
        p = queue.pop(0)
        if p.left:
            if stop:
                return False
            queue.append(p.left)
        else:
            stop = True
        if p.right:
            if stop:
                return False
            queue.append(p.right)
        else:
            stop = True
    return True

参考答案
/
struct TreeNode {
int val;
struct TreeNode
left;
struct TreeNode right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
/

class CheckCompletion {
public:
bool chk(TreeNode root) {
TreeNode
q[800],*now;
int head = 0,tail = 0;
q[tail ++] = root;
while(head != tail){
now = q[head ++];
if(now->left) q[tail ++] = now->left;
if(now->right) q[tail ++] = now->right;
}
bool flag = false;
for(int i = 0;i < tail;++ i)
if(q[i]->left == NULL || q[i]->right == NULL){
if(q[i]->right && q[i]->left == NULL) return false;
if(!flag) flag = true;
else if(q[i]->left || q[i]->right) return false;
}
return true;
}
};

转载于:https://blog.51cto.com/13545923/2054446

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值