题目粗心

给定一棵含有N个节点的二叉树,判断是否是齐全二叉树

算法思路

判断一颗二叉树是否是齐全二叉树的规定:

  • 1、如果呈现只有右孩子节点的,肯定不是
  • 2、如果呈现只有左孩子或者没有孩子节点的,记录该状况
  • 3、如果以后有孩子,并且呈现了状况2,肯定不是
  • 4、遍历树中所有节点后,如果没有1和3,表明该树为齐全二叉树

遍历形式采纳层序遍历。在遍历过程中应用count记录遍历的节点个数,在count=N的时候阐明来到了最初一个节点,应用lastNode记录。
对于根节点的确定能够应用一个father数组记录每一个节点的父节点编号,初始化全副为-1,在输出完结后,遍历一遍,第一次遇到-1的编号就是根节点。

提交后果

AC代码

#include <cstdio>#include <iostream>#include <queue>using namespace std;struct Node{    int left = -1;    int right = -1;    int index{};}nodes[25];queue<Node> que;int lastNode;bool isComplete(int root,int N){    que.push(nodes[root]);    bool flag = false;// 标记是否呈现状况2    int count = 0;    while(!que.empty()){        Node t = que.front();        que.pop();        ++count;        if(count==N){            // 最初一个节点            lastNode = t.index;        }        if(t.left==-1&&t.right!=-1) {            // 状况1            return false;        }else if(t.left!=-1||t.right!=-1) {            // 以后节点有孩子            if(flag){                return false;            }        }else if((t.left!=-1&&t.right==-1)||(t.left==-1&&t.right==-1)){            // 只有左孩子或者没有孩子            flag = true;        }        if(t.left!=-1){            que.push(nodes[t.left]);        }        if(t.right!=-1){            que.push(nodes[t.right]);        }    }    return true;}int main() {    int N;    scanf("%d",&N);    int father[N];    for(int i=0;i<N;++i){        father[i] = -1;    }    string left,right;    for(int i=0;i<N;++i){        cin>>left>>right;        nodes[i].index = i;        if(left!="-"){            int leftChild = stoi(left);            father[leftChild] = i;            nodes[i].left = leftChild;        }        if(right!="-"){            int rightChild = stoi(right);            father[rightChild] = i;            nodes[i].right = rightChild;        }    }    int root = 0;    for(int i=0;i<N;++i){        if(father[i]==-1){            root = i;            break;        }    }    if(isComplete(root,N)){        printf("YES %d",lastNode);    }else{        printf("NO %d",root);    }    return 0;}