- 题目链接:958. 二叉树的完全性检验
- 考查知识:二叉树+遍历
- 题意描述:判断一棵二叉树是否是完全二叉树
- 具体代码
-
方法一:递归
- 首先要熟悉完全二叉树结点编号,若根从1开始编号,则编号为k孩子,左孩子2k,右孩子2k+1,k<=n/2时为非叶节点,否则为叶结点
- 在递归遍历所有结点后,我们判断总的二叉树结点数是否等于完全二叉树最大结点编号,相等则为完全二叉树
class Solution { int n=0,mx=0; public: bool isCompleteTree(TreeNode* root) { dfs(root,1);//根节点编号为1 return n==mx;// } void dfs(TreeNode* root,int k){ if(root==NULL||k>100)return;//递归到了叶子结点 或 完全二叉树结点超过题给范围 n++;mx=max(mx,k);//记录树结点数和最大节点编号 dfs(root->left,2*k);//递归左右子树 dfs(root->right,2*k+1); } };
-
方法二:层序遍历
- 完全二叉树是只有最下面一层不满的满二叉树,所以层序遍历时,一定是遍历完所有非空链域后,才会遍历空链域
- 反之,若不符合上述要求的,即在访问到空链域后又访问非空链域的二叉树判断为不是完全二叉树;
- 否则能遍历完整棵二叉树即完全二叉树
class Solution { public: bool isCompleteTree(TreeNode* root) { queue<TreeNode*>q; int f=0;//1标记访问到叶节点0标记访问非叶节点 q.push(root); while(!q.empty()){ TreeNode *t=q.front();q.pop(); if(t==NULL)f=1;//访问空链域 else{//访问非空链域 if(f)return false;//层序遍历过空链域后又遍历到非空链域,说明不是完全二叉树 q.push(t->left); q.push(t->right); } } return true; } };
-