判断二叉树是否为完全二叉树

本文介绍了一种通过队列层次遍历的方法来判断一个给定的二叉树是否为完全二叉树。通过创建二叉树并进行层次遍历,如果遇到空节点后仍有非空节点,则该树不是完全二叉树。

基本思路:使用队列按层次遍历二叉树,遍历过程中将二叉树的所有结点依次入队。当出队遇见一个NULL结点时,若遍历其后结点都为NULL则为完全二叉树,否则不是完全二叉树。因为层次遍历完全二叉树时,当遍历到空结点时前面所有非空结点已经被遍历完了,若空结点之后还有非空结点则不是完全二叉树。

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

/*判断一个二叉树是不是完全二叉树*/

//先序创建二叉树
typedef struct TNode
{
    int data;
    struct TNode *left;
    struct TNode *right;
 } TNode,*PTNode;

PTNode createTree()
{
    PTNode ptnode;
    printf("输入结点值:");
    int data;
    scanf("%d",&data);
    if(data==0)
    {
        ptnode = NULL;
    }
    else
    {
        ptnode = (PTNode)malloc(sizeof(TNode));
        ptnode->data = data;
        ptnode->left = createTree();
        ptnode->right = createTree();
    }

    return ptnode;
}
//先序打印二叉树 
void print(PTNode ptnode)
{
    if(ptnode!=NULL)
    {
        printf("%d ",ptnode->data);
        print(ptnode->left);
        print(ptnode->right);
    }
}

//创建队列
typedef struct QNode
{
    PTNode ptnode;
    struct QNode *next;
 }QNode,*PQNode;

typedef struct Queue
{
    PQNode front;
    PQNode rear;
}Queue,*PQueue;

PQueue initQueue()
{
    PQueue pqueue = (PQueue)malloc(sizeof(Queue));
    PQNode pqnode = (PQNode)malloc(sizeof(QNode));
    if(pqnode == NULL)
    {
        printf("init queue error\n");
        exit(-1);
    }
    pqueue->front = pqnode;
    pqueue->rear = pqnode;
    pqueue->front->next = NULL;
    return pqueue;
}

void enQueue(PQueue pqueue,PTNode ptnode)
{
    PQNode pqnode = (PQNode)malloc(sizeof(QNode));
    if(pqnode == NULL)
    {
        printf("enqueue error\n");
        exit(-1);
    }
    pqnode->ptnode = ptnode;
    pqnode->next = NULL;
    pqueue->rear->next = pqnode;
    pqueue->rear = pqnode;
}

PTNode deQueue(PQueue pqueue)
{
    if(pqueue->front == pqueue->rear)
    {
        printf("deQueue error! queue is null\n");
        exit(-1); 
    }
    PQNode p = pqueue->front->next;
    pqueue->front->next = p->next;
    if(p == pqueue->rear)
    {
        pqueue->rear = pqueue->front;
    }
    PTNode ptnode = p->ptnode;
    free(p);
    return ptnode;
}

bool isEmpty(PQueue pqueue)
{
    if(pqueue->front == pqueue->rear)
    {
        return true;
    }
    return false;
}

//判断二叉树是不是完全二叉树
bool isFullBintree(PTNode root)
{
    PQueue pqueue = initQueue();
    if(root==NULL)
        return true;
    PTNode cur = NULL;  //指向队列头结点中的二叉树节点的指针
    enQueue(pqueue,root);
    while((cur = deQueue(pqueue))!=NULL)    //层次遍历树结点,遇见空结点停止遍历 
    {
        printf("%d \n",cur->data);  //层次遍历输出结点值,若为完全二叉树则输出为层次遍历结果 
        enQueue(pqueue,cur->left);
        enQueue(pqueue,cur->right); 
    }
    while(!isEmpty(pqueue))    //检查空结点之后结点,如果有非空结点则不是完全二叉树 
    {
        if(deQueue(pqueue)!=NULL)
        return false;

    }

    return true;
}  

int main(int argc, char *argv[]) {
    PTNode root;
    root = createTree();
    print(root); 
    printf("\n");
    if(isFullBintree(root))
    {
        printf("is full binary tree\n");
    }
    else
    {
        printf("not full binary tree\n");
    }
    return 0;
}
### 回答1: 可以使用递归算法来判断二叉树是否完全二叉树,代码如下:def isCompleteTree(root): if root is None: return True if root.left is None and root.right is None: return True if root.left is None: return False if root.right is None: return isCompleteTree(root.left) return isCompleteTree(root.left) and isCompleteTree(root.right) ### 回答2: 判断一棵二叉树是否完全二叉树,可以使用层次遍历的方式进行判断。具体的代码如下: ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def isCompleteTree(root): if not root: return False queue = [root] flag = False # 标识是否出现空节点 while queue: node = queue.pop(0) if node.left: # 如果之前出现了空节点,则此时不能再出现左孩子节点为空的情况 if flag: return False queue.append(node.left) else: flag = True if node.right: # 如果之前出现了空节点,则此时不能再出现右孩子节点为空的情况 if flag: return False queue.append(node.right) else: flag = True return True ``` 该方法使用了一个队列来进行层次遍历,每次从队列中取出一个节点,判断它的左右孩子节点是否为空。如果出现了某个节点的左孩子为空而右孩子不为空的情况,返回False;如果之前已经出现了空节点,但当前节点的左右孩子节点不为空,也返回False。只有当遍历完所有节点后都满足上述条件,才返回True,即为一棵完全二叉树。 ### 回答3: 判断二叉树是否完全二叉树可以采用层序遍历的方法来进行。首从根节点开始遍历二叉树,将每一个遍历到的节点加入到一个队列中。在遍历的过程中,如果遇到空节点,则将其也加入到队列中,并且停止继续遍历。 接下来,从队列的头部开始出队列,判断出队的节点是否为一个临时的空节点。如果是,则继续出队其他节点直到遇到一个非空节点。如果在出队的过程中遇到了非空节点,那么该二叉树就不是完全二叉树。 继续遍历队列中的其他节点。如果队列中有其他非空节点,那么该二叉树就不是完全二叉树。 最后,如果队列中的所有元素都已经遍历完,而没有出现非空节点,则该二叉树完全二叉树。 下面是用代码实现上述过程的方法: ```python class TreeNode(object): def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def isCompleteTree(root): if root is None: return True queue = [root] flag = False while len(queue) > 0: node = queue.pop(0) if node is None: flag = True elif flag: return False else: queue.append(node.left) queue.append(node.right) return True ``` 其中,TreeNode是二叉树节点的定义,isCompleteTree函数用于判断二叉树是否完全二叉树
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值