使用 C++ 检查二叉树的完整性
c++server side programmingprogramming更新于 2024/9/1 4:53:00
假设我们有一棵二叉树。我们必须检查这棵树是否是完全二叉树。一棵 n 级完全二叉树有 n-1 个完整层,并且 n 级的所有节点都从左侧填充。因此,如果输入树类似于 −
然后输出将为 true,因为这是完全二叉树。
要解决这个问题,我们将遵循以下步骤 −
如果树为空,则返回 null
创建队列 q 并将根插入其中
设置标志 := true
当 q 有一些元素时
sz := 队列的大小
当 sz 不是时0
从队列中删除后,节点 := 节点
如果节点有左子树,则
如果设置了标志,则将节点的左子树插入 q,否则返回 false
否则标志 := false
如果节点有右子树,则
如果设置了标志,则将节点的右子树插入 q,否则返回 false
flag := false
sz := sz – 1
return ture
让我们看看下面的实现以便更好地理解 −
示例
#include <bits/stdc++.h> using namespace std; class TreeNode{ public: int val; TreeNode *left, *right; TreeNode(int data){ val = data; left = NULL; right = NULL; } }; void insert(TreeNode **root, int val){ queue<TreeNode*> q; q.push(*root); while(q.size()){ TreeNode *temp = q.front(); q.pop(); if(!temp->left){ if(val != NULL) temp->left = new TreeNode(val); else temp->left = new TreeNode(0); return; }else{ q.push(temp->left); } if(!temp->right){ if(val != NULL) temp->right = new TreeNode(val); else temp->right = new TreeNode(0); return; }else{ q.push(temp->right); } } } TreeNode *make_tree(vector<int> v){ TreeNode *root = new TreeNode(v[0]); for(int i = 1; i<v.size(); i++){ insert(&root, v[i]); } return root; } class Solution { public: bool isCompleteTree(TreeNode* root) { if(!root)return true; queue <TreeNode*> q; q.push(root); bool isComplete = true; while(!q.empty()){ int sz = q.size(); while(sz--){ TreeNode* node = q.front(); q.pop(); if(node->left){ if(isComplete){ q.push(node->left); }else return false; }else{ isComplete = false; } if(node->right){ if(isComplete){ q.push(node->right); }else return false; }else{ isComplete = false; } } } return true; } }; main(){ vector<int> v = {1,2,3,4,5,6}; TreeNode *r1 = make_tree(v); Solution ob; cout << (ob.isCompleteTree(r1)); }
输入
{1,2,3,4,5,6}
输出
1