考研数据结构

判断树是否是完全二叉树

2018-12-04  本文已影响14人  飞白非白

算法思想: 遇到第一个没有左儿子或者右儿子的节点,设置标志位,如 果之后再遇到有左右儿子的节点,那么这不是一颗完全二叉树

//二叉树结点定义  
    typedef struct Node  
    {  
        int data;  
        struct Node* left;  
        struct Node* right;  
    }Node;  
      
    //实现广度遍历需要队列  
    Queue<Node*> queue;  
      
    //第n层最右节点标志  
    bool leftMost = false;  
      
    bool ProcessChild(Node* child)  
    {  
        if (child)  
        {  
            if (!leftMost)  
            {  
                queue.push(child);  
            }  
            else  
            {  
                return false;  
            }  
        }  
        else  
        {  
            leftMost = true;  
        }  
      
        return true;  
    }  
      
    bool IsCompleteBinaryTree(Node* root)  
    {  
        //空树也是完全二叉树  
        if (!root)  
            return true;  
      
        //首先根节点入队列  
        queue.push(root);  
      
        while(!queue.empty())  
        {  
            Node* node = queue.pop();  
      
            //处理左节点  
            if (!ProcessChild(node->left))  
                return false;  
      
            //处理右节点  
            if (!ProcessChild(node->right))  
                return false;  
        }  
      
        //广度优先遍历完毕,此乃完全二叉树  
        return true;  
    }

上一篇 下一篇

猜你喜欢

热点阅读