牛客BM35. 判断是不是完全二叉树

Description:

题目大意:判断是不是完全二叉树

解题思路:

算法标签:BFS

  1. 完全二叉树的空节点在最后结尾处
  2. 进行层序遍历,如果未到结尾处就访问到空节点,则不是完全二叉树

代码:

/*
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 *	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
class Solution {
public:
    bool isCompleteTree(TreeNode* root) {
        if(root == NULL)
            return true;
        
        // 层序遍历如果未访问完就有空节点,就不是完全二叉树
        queue<TreeNode* >tree;
        tree.push(root);
        
        // 标记空节点
        bool flag = false;
        while(!tree.empty()) {
            int size = tree.size();
            for(int i = 0;i < size;i++) {
                TreeNode* node = tree.front();
                tree.pop();
                if(flag && node != NULL)
                    return false;
                if(node == NULL)
                    flag = true;
                else {
                    tree.push(node -> left);
                    tree.push(node -> right);
                }   
            }
        }
        return true;
    }
};
### 牛客 BM4 链表反转的 C++ 实现 链表反转是一个经典的算法问题,其核心思想是从头到尾遍历原链表,在遍历时改变节点指向的方向。以下是基于牛客BM4 的具体实现。 #### 方法描述 通过迭代的方式完成链表反转操作。定义三个指针变量 `prev`、`curr` 和 `nextNode` 来分别表示前驱节点、当前节点以及下一个节点。初始状态下,`prev` 设为 `nullptr` 表示新链表的末尾为;随后逐步移动这些指针并调整它们之间的连接关系直到整个链表被完全翻转[^1]。 #### 代码实现 下面提供了一个完整的C++程序来解决这个问题: ```cpp #include <iostream> using namespace std; // 定义单向链表结构体 struct ListNode { int val; ListNode* next; ListNode(int x) : val(x), next(nullptr) {} }; ListNode* reverseList(ListNode* head) { ListNode *prev = nullptr, *curr = head; while (curr != nullptr){ ListNode* nextTemp = curr->next; // 暂存后续节点 curr->next = prev; // 反转当前节点指针方向 prev = curr; // 移动prev和curr向前推进一步 curr = nextTemp; } return prev; // 返回新的头部 } void printList(ListNode* node){ // 辅助函数用于打印链表内容 while(node!=nullptr){ cout<<node->val<<" "; node=node->next; } cout<<"\n"; } int main(){ // 创建测试用例:1 -> 2 -> 3 -> 4 -> 5 ListNode* list=new ListNode(1); list->next= new ListNode(2); list->next->next= new ListNode(3); list->next->next->next= new ListNode(4); list->next->next->next->next= new ListNode(5); cout << "Original List: "; printList(list); // 打印原始列表 ListNode* reversedHead = reverseList(list); // 调用reverseList方法得到逆序后的首地址 cout << "Reversed List: "; printList(reversedHead); // 打印逆转之后的结果 return 0; } ``` 此段代码首先构建了一个简单的单项链表实例化对象,并调用了 `reverseList()` 函数对其进行倒置处理后再输出结果验证正确性。 #### 复杂度分析 时间复杂度 O(n),其中 n 是链表长度。因为只需一次扫描即可完成全部修改工作。 间复杂度 O(1),只使用了固定数量额外的间存储临时变量。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值