java中判断是否为空的二叉树_判断一棵二叉树是否为搜索二叉树和完全二叉树...

1

/**

* struct TreeNode {

*int val;

*struct TreeNode *left;

*struct TreeNode *right;

* };

*/

class Solution {

public:

/**

*

* @param root TreeNode类 the root

* @return bool布尔型vector

*/

vector judgeIt(TreeNode* root) {

// write code here

if (!root)

return {};

vector ans(2);

ans[0] = dfs(root);

ans[1] = bfs(root);

return ans;

}

bool dfs(TreeNode *root) {

if (!root)

return true;

if (root->left && root->left->val > root->val)

return false;

if (root->right && root->right->val val)

return false;

return dfs(root->left) && dfs(root->right);

}

bool bfs(TreeNode *root) {

queue q;

q.push(root);

//int level = 0;

while (!q.empty()) {

int nums = q.size();

//if (nums != pow(2, level++))  //这个是满二叉树的判断。。

//    return false;

for (int i = 0; i 

TreeNode *tmp = q.front();

q.pop();

if(!tmp->left && tmp->right)   //左空有右肯定不是完全二叉树。。

return false;

if (tmp->left)

q.push(tmp->left);

if (tmp->right)

q.push(tmp->right);

}

}

return true;

}

};

编辑于 2021-02-08 12:02:37

回复(0)

1

/**

* struct TreeNode {

*int val;

*struct TreeNode *left;

*struct TreeNode *right;

* };

*/

class Solution {

public:

/**

*

* @param root TreeNode类 the root

* @return bool布尔型vector

*/

vector judgeIt(TreeNode* root) {

// write code here

vector v;

vector ans;

int flag = 0;

inorder(root, v,flag);

ans.push_back(flag==1?false:true);

ans.push_back(isCompleteTree(root));

return ans;

}

//判断二叉搜索树的依据是中序遍历一定是升序序列

void inorder(TreeNode* root,vector& v,int& flag){

if(flag) return;

if(root->left) inorder(root->left, v,flag);

if(!v.empty()&&root->val 

v.push_back(root->val);

if(root->right) inorder(root->right, v,flag);

}

//bfs搜索,如果第一次遇到空节点之后又发现非空节点,则非完全二叉树

bool isCompleteTree(TreeNode* root){

if(!root) return true;

queue q;

q.push(root);

int flag = 0;

while(!q.empty()){

TreeNode* t = q.front();

q.pop();

if(t->left){

if(flag) return false;

else q.push(t->left);

}

else flag = 1;

if(t->right){

if(flag) return false;

else q.push(t->right);

}

else flag = 1;

}

return true;

}

};

发表于 2021-02-02 16:57:16

回复(0)

1

import java.util.*;

/*

* public class TreeNode {

*   int val = 0;

*   TreeNode left = null;

*   TreeNode right = null;

* }

*/

import java.util.Queue;

import java.util.LinkedList;

public class Solution {

/**

*

* @param root TreeNode类 the root

* @return bool布尔型一维数组

*/

public boolean[] judgeIt (TreeNode root) {

// write code here

boolean[] check = new boolean[2];

check[0] = isSearch(root, Integer.MIN_VALUE, Integer.MAX_VALUE);

check[1] = isComplete(root);

return check;

}

public boolean isSearch(TreeNode root, int minVal, int maxVal){

if (root == null) return true;

boolean flag = (root.val >= minVal && root.val <= maxVal);

return flag && isSearch(root.left, minVal, root.val) && isSearch(root.right, root.val, maxVal);

}

public boolean isComplete(TreeNode root){

if (root == null) return true;

Queue queue = new LinkedList<>();

queue.offer(root);

boolean isLeaf = false;

while (!queue.isEmpty()){

int cnt = queue.size();

for(int i = 1;i <= cnt; ++i){

TreeNode now = queue.poll();

if (isLeaf && now.left != null) return false;

if (now.left == null && now.right != null) return false;

if (now.right == null) isLeaf = true;

if (now.left != null) queue.offer(now.left);

if (now.right != null) queue.offer(now.right);

}

}

return true;

}

}

发表于 2021-01-26 10:45:52

回复(0)

1

1.判断二叉搜索树

仅用左子树举例,注意左子树的所有结点比根小,不仅仅是左值

比如右子树的左子树,它不仅要小于父结点的值,还要大于根节点的值。

2.判断完全二叉树

四种情况递归(麻烦,不如用队列好) class Solution {

public:

/**

*

* @param root TreeNode类 the root

* @return bool布尔型vector

*/

bool bst(TreeNode* root,int mins,int maxs){

if(root==nullptr)    return true;

if(root->val>maxs || root->val

return bst(root->left,mins,root->val)&&bst(root->right,root->val,maxs);

}

bool flag=true,legel=true;

int level(TreeNode* root){//保证右子树不比左子树低

if(root==nullptr)    return 0;

if(root->left==nullptr && root->right!=nullptr)    legel=false;

int lefthight=level(root->left);

int righthight=level(root->right);

if(lefthight

return righthight+1;

}

bool iscom(TreeNode* root){

if(root==nullptr)    return true;

if(root->left==nullptr && root->right==nullptr)

flag=false;

else if(root->left!=nullptr && root->right==nullptr){

if(!flag)    flag=false;

else    return false;

}

else if(root->left==nullptr && root->right!=nullptr)

return false;

return iscom(root->left)&&iscom(root->right);

}

vector judgeIt(TreeNode* root) {

// write code here

vector res;

res.push_back(bst(root,INT_MIN,INT_MAX));

level(root);

if(!legel)    res.push_back(false);

else res.push_back(iscom(root));

return res;

}

};

编辑于 2021-01-11 19:46:37

回复(2)

1

class Solution {

public:

vector judgeIt(TreeNode* root) {

// write code here

vector res{true,true};

if (!root)  return res;

inOrder(root);

for(int i = 1;i

if (midSeq[i] 

res[0] = false;

break;

}

res[1] = isComplete(root);

return res;

}

void inOrder(TreeNode* root) {  //中序遍历

if (root == nullptr)  return;

inOrder(root->left);

midSeq.emplace_back(root->val);

inOrder(root->right);

}

bool isComplete(TreeNode* root) {

queue q;

q.push(root);

while (!q.empty())  //层序遍历

{

int len = q.size();

for (int i = 0; i 

TreeNode* temp = q.front();

if (temp->left && temp->right) {  //左右孩子都有

q.push(temp->left);

q.push(temp->right);

q.pop();

}

else if (temp->right)  return false;  //只有右孩子

else{  //只有左孩子,或者叶子节点

if(temp->left)  q.push(temp->left);

q.pop();

while (!q.empty()){  //其后须全是叶子节点

if (q.front()->left || q.front()->right)  return false;

q.pop();

}

return true;

}

}

}

}

private:

vector midSeq;//中序遍历序列

};

这是一份可能不是最简洁,但可能最好懂的code。

首先,检查是否搜索二叉树,可以利用中序遍历,这里开辟了额外空间来存储,还额外地多了一次遍历检查是否有序。其实也可以在中序遍历的时候记录每个值,检查是否符合前一个比后一个小,这样时空开销会更小。

其次,完全二叉树的性质是除最后一层之外要求满,最后一层在左。层次遍历的过程中按节点的孩子节点分四种情况,其中左右孩子节点均有是常见的,有右孩子无左孩子违背了性质,有左孩子无右孩子或者达到叶子节点说明其后需全是叶子节点。

以上。

编辑于 2020-09-24 15:04:32

回复(0)

1

# class TreeNode:

#     def __init__(self, x):

#         self.val = x

#         self.left = None

#         self.right = None

#

#

# @param root TreeNode类 the root

# @return bool布尔型一维数组

#

import collections

class Solution:

def judgeIt(self , root ):

# write code here

def dfs(root):

pre=-1

que=[]

while(que&nbs***bsp;root):

while(root):

que.append(root)

root=root.left

root=que.pop()

if pre>root.val:

return False

pre=root.val

root=root.right

return True

pre=root.val

return dfs(root.right)

def isfull(root):

que=collections.deque([root])

while(que):

c=que.popleft()

if not c:

while(que):

c=que.popleft()

if c:

return False

else:

que.append(c.left)

que.append(c.right)

return True

return [dfs(root),isfull(root)]

PY的代码,为了减少运行时间,都用的非递归实现,但是还是只能过84.21%,递归的方法只能74%。

我看大家通过的代码都是CPP的。。。 有点无奈

发表于 2020-09-18 14:02:44

回复(0)

1

class Solution {

public:

/**

*

* @param root TreeNode类 the root

* @return bool布尔型vector

*/

vector judgeIt(TreeNode* root) {

vector res{true,true};

if(root==NULL) return res;

//检测有序

vector nums;

func1(root,nums);

int cur=nums[0];

for(int i=1;i

if(cur>nums[i]){

res[0]=false;

}

}

//检测完全二叉树

vector cur_level{root};

res[1]=func2(cur_level);

return res;

}

void func1(TreeNode* root,vector& nums){

if(root==nullptr) return ;

func1(root->left, nums);

nums.push_back(root->val);

func1(root->right,nums);

return ;

}

bool func2(vector& cur_level){

int flag=true;

vector next_level;

for(int i=0;i

if(cur_level[i]!=nullptr){

if(flag==false){//如果前面出现过了空指针

return false;

}

next_level.push_back(cur_level[i]->left);

next_level.push_back(cur_level[i]->right);

}

else{//

flag=false;

}

}

if(next_level.size()==0) return true;

return func2(next_level);

}

};

现场手撕就卡壳,面完复盘冷静下来就能写出来了,难受啊

发表于 2020-09-08 19:59:28

回复(0)

1

非递归

/**

* struct TreeNode {

*int val;

*struct TreeNode *left;

*struct TreeNode *right;

* };

*/

class Solution {

public:

/**

*

* @param root TreeNode类 the root

* @return bool布尔型vector

*/

bool judgeSearch(TreeNode* root){

if(root==nullptr)

return false;

TreeNode *p = root;

vector tmp;

stack s;

while(!s.empty() || p){

while(p){

s.push(p);

p = p->left;

}

if(!s.empty()){

p = s.top();

s.pop();

tmp.push_back(p->val);

p = p->right;

}

}

for(int i = 1; i 

if(tmp[i] 

return false;

return true;

}

bool judgeTotal(TreeNode *root){

if(root==nullptr)

return false;

TreeNode *p = root;

queue q;

q.push(root);

while(!q.empty()){

p = q.front();

q.pop();

if(p->left && p->right){

q.push(p->left);

q.push(p->right);

}

else if(p->left==nullptr && p->right)

return false;

else{

if(p->left && p->right==nullptr)

while(!q.empty()){

p = q.front();

q.pop();

if(p->left || p->right)

return false;

}

}

}

return true;

}

vector judgeIt(TreeNode* root) {

// write code here

vector res;

res.push_back(judgeSearch(root));

res.push_back(judgeTotal(root));

return res;

}

};

发表于 2020-09-08 10:48:35

回复(3)

0

import java.util.*;

/*

* public class TreeNode {

*   int val = 0;

*   TreeNode left = null;

*   TreeNode right = null;

* }

*/

public class Solution {

/**

*

* @param root TreeNode类 the root

* @return bool布尔型一维数组

*/

public boolean[] judgeIt (TreeNode root) {

// write code here

boolean[] res = new boolean[2];

res[0] = judgeBST(root);

res[1] = judgeCBT(root);

return res;

}

private boolean judgeBST(TreeNode root) {

if(root == null) {

return true;

}

if(root.left != null && root.left.val > root.val) return false;

if(root.right != null && root.right.val 

boolean left = judgeBST(root.left);

boolean right = judgeBST(root.right);

return left && right;

}

private boolean judgeCBT(TreeNode root) {

Queue queue = new LinkedList<>();

if(root == null) return true;

queue.offer(root);

TreeNode node = null;

while(!queue.isEmpty()) {

node = queue.poll();

if(node == null) {

break;

}

queue.offer(node.left);

queue.offer(node.right);

}

while(!queue.isEmpty()) {

node = queue.poll();

if(node != null) {

return false;

}

}

return true;

}

}

发表于 2021-02-26 17:12:58

回复(0)

0

/**

* struct TreeNode {

*int val;

*struct TreeNode *left;

*struct TreeNode *right;

* };

*/

class Solution {

public:

/**

*

* @param root TreeNode类 the root

* @return bool布尔型vector

*/

vector judgeIt(TreeNode* root) {

// write code here

judge.push_back(true);

judge.push_back(true);

h=0;

flag=0;

MidFS(root);

return judge;

}

void MidFS(TreeNode* root){

if(root!=NULL){

h++;

MidFS(root->left);

if(!Midlist.empty()&&root->val

judge[0]=false;

}

Midlist.push_back(root->val);

if(root->left==NULL||root->right==NULL){

if(root->left==NULL&&root->right==NULL){

if(H.empty()){

H.push_back(h);

maxh=h;

}

else{

int lefth=H[H.size()-1];

if(h==maxh){

if(h>lefth){

judge[1]=false;

}

}

else if(h

judge[1]=false;

}

H.push_back(h);

}

}

else{

if(root->left==NULL||flag==1){

judge[1]=false;

}

else{

flag=1;

}

}

}

MidFS(root->right);

h--;

}

}

private:

vector Midlist;        //中序遍历序列

vector judge;

int h,maxh,flag;        //树的高度

vector  H;    //储存树的高度

};

编辑于 2021-02-26 13:24:43

回复(0)

0

/**

* struct TreeNode {

*int val;

*struct TreeNode *left;

*struct TreeNode *right;

* };

*/

class Solution {

public:

/**

*

* @param root TreeNode类 the root

* @return bool布尔型vector

*/

vector judgeIt(TreeNode* root) {

// write code here

return {isSearchTree(root,INT_MIN,INT_MAX),isCompletedTree(root)};

}

bool isCompletedTree(TreeNode* root)

{

if(root == nullptr)

return true;

if(root->left && root->right == nullptr)

return isCompletedTree(root->left);

if(root->left == nullptr && root->right)

return false;

return isCompletedTree(root->left) && isCompletedTree(root->right);

}

bool isSearchTree(TreeNode *root, int left, int right)

{

if(root == nullptr)

return true;

if(root->val val > right)

return false;

return isSearchTree(root->left,left,root->val) && isSearchTree(root->right, root->val,right);

}

};

发表于 2021-02-26 11:49:55

回复(0)

0

/**

* struct TreeNode {

*int val;

*struct TreeNode *left;

*struct TreeNode *right;

* };

*/

class Solution {

public:

/**

*

* @param root TreeNode类 the root

* @return bool布尔型vector

*/

vector judgeIt(TreeNode* root) {

// write code here

vectorans;

ans.push_back(dfs(root));

ans.push_back(bfs(root));

return ans;

}

bool dfs(TreeNode* root)

{

if(root == nullptr)

return true;

if(root ->left != nullptr && root ->left ->val > root ->val)

return false;

if(root ->right != nullptr && root ->right->val val)

return false;

return dfs(root ->left) && dfs(root ->right);

}

bool bfs(TreeNode* root)

{

if(root == nullptr)

return false;

queue q;

q.push(root);

while(!q.empty())

{

TreeNode* n = q.front();

q.pop();

if(n ->left && n->right)

{

q.push(n ->left);

q.push(n ->right);

}

else if(n ->left == nullptr && n ->right)

{

return false;

}

else

{

// 如果n 只有left节点,要确保n之后全是叶子节点,

// 否则标记之后的顺序和满二叉树不一致,即不是完全二叉树

if(n ->left != nullptr && n ->right == nullptr)

{

while(!q.empty())

{

TreeNode* p = q.front();

q.pop();

if(p ->left || p->right)

return false;

}

}

}

}

return true;

}

};

发表于 2021-02-20 15:55:37

回复(0)

0

boolean[] res={true,true};

public boolean[] judgeIt (TreeNode root) {

if (root==null) return res;

if (root.left==null&&root.right!=null&&root.right.val

res[0]=false;

res[1]=false;

}

if(root.left!=null&&root.right==null&&root.left.val>root.val){

res[0]=false;

}

if (root.left!=null&&root.right!=null){

if (root.left.val>root.val||root.right.val

}

judgeIt(root.left);

judgeIt(root.right);

return res;

编辑于 2021-02-12 12:08:38

回复(0)

0

import java.util.*;

/*

* public class TreeNode {

*   int val = 0;

*   TreeNode left = null;

*   TreeNode right = null;

* }

*/

public class Solution {

/**

*

* @param root TreeNode类 the root

* @return bool布尔型一维数组

*/

public boolean[] judgeIt (TreeNode root) {

boolean[]res={judgeSearchTree(root),isComplete(root)};

return res;

}

// 二叉搜索树:每个节点左边节点小于右边节点,左子树的最大值一定小于根节点,小于右子树的最大值;

//通过中序遍历,严格递增

public boolean judgeSearchTree(TreeNode root){

ArrayList list=new ArrayList();

midSearch(root,list);

for(int i=1;i

if(list.get(i)

}

return true;

}

public void midSearch(TreeNode root, ArrayListlist){

if(root==null) return;

midSearch(root.left,list);

list.add(root.val);

midSearch(root.right,list);

}

// 完全二叉树:层序遍历,主要分四种情况:

//左右孩子都有、只有左孩子、只有右孩子、叶子节点

public boolean isComplete(TreeNode root){

if(root==null) return true;

Queuequeue=new LinkedList();

queue.add(root);

while(!queue.isEmpty()){

int size=queue.size();

for(int i=0;i

TreeNode node=queue.poll();

if(node.left!=null&&node.right!=null){

queue.add(node.left);

queue.add(node.right);

}

else if(node.right!=null) return false;//只有右孩子,不是完全子树

else{//只有左孩子或者是叶子节点

if(node.left!=null) queue.add(node.left);

//后面只能是叶子节点

while(!queue.isEmpty()){

TreeNode node1=queue.poll();

if(node1.left!=null||node1.right!=null) return false;

}

return true;//不用再继续处理了

}

}

}

return true;

}

}

发表于 2021-02-04 19:15:04

回复(0)

0

/**

* struct TreeNode {

*int val;

*struct TreeNode *left;

*struct TreeNode *right;

* };

*/

class Solution {

public:

/**

*

* @param root TreeNode类 the root

* @return bool布尔型vector

*/

vector judgeIt(TreeNode* root) {

// write code here

vector res;

res.push_back(isSearch(root));

res.push_back(isFull(root));

return res;

}

bool isSearch(TreeNode*root){

if(root==nullptr){return true;}

if(root->left==nullptr&&root->right==nullptr){

return true;

}

if(root->left==nullptr){

if(root->valright->val){

return isSearch(root->right);

}else{return false;}

}

if(root->right==nullptr){

if(root->val > root->left->val){

return isSearch(root->left);

}else{return false;}

}

if(root->left->valval&&root->valright->val){

return isSearch(root->left)&&isSearch(root->right);

}return false;

}

bool isFull(TreeNode*root){

if(root==nullptr){return true;}

queue aux;

bool flag=0;

aux.push(root);

TreeNode* cur=root;

while(!aux.empty()){

cur=aux.front();

if(cur->left!=nullptr){aux.push(cur->left);}

if(cur->right!=nullptr){aux.push(cur->right);}

if(cur->left==nullptr&&cur->right!=nullptr){return false;}

if(flag==1&&(cur->left!=nullptr||cur->right!=nullptr)){

return false;

}

if(cur->right==nullptr||cur->left==nullptr){flag=1;

//flag标准出现左右子节点为空的节点,之后不可再出现非页节点}

aux.pop();

}

return true;

}

};

通过了94%,求大佬看一下哪里出了问题

发表于 2021-01-22 21:46:49

回复(0)

0

# class TreeNode:

#     def __init__(self, x):

#         self.val = x

#         self.left = None

#         self.right = None

#

#

# @param root TreeNode类 the root

# @return bool布尔型一维数组

#

class Solution:

def judgeIt(self , root ):

# write code here

return [False,False]

呃呃呃,为什么我就返回两个bool值都能超时啊。。。阿这。。。

发表于 2021-01-18 22:58:02

回复(0)

0

//判断搜索树借鉴了大佬经验,均使用递归,平衡树若有bug敬请指正

public class Solution {     /**

*

* @param root TreeNode类 the root

* @return bool布尔型一维数组

*/

int temp = -1;

public boolean[] judgeIt (TreeNode root) {

// write code here

boolean []result = new boolean[2];

result[0]= sel(root);

int i =wandel(root);

if(i==0||i==1){

result[1] = true;

}else{

result[1] = false;

}

return result;

}

boolean sel(TreeNode root){

if(root==null){ return true;}

if(!sel(root.left)){return false;}

if(root.val<=temp){

return false;

}

temp = root.val;

return  sel(root.right);

}

int wandel(TreeNode root){

if(root == null){return 0;}

if(root.left==null&&root.right!=null){

return -100;

}

int left = wandel(root.left)+1;

int right = wandel(root.right)+1;

return left-right;

}

}

发表于 2021-01-18 20:54:26

回复(0)

0

import java.util.*;

/*

* public class TreeNode {

*   int val = 0;

*   TreeNode left = null;

*   TreeNode right = null;

* }

*/

public class Solution {

/**

*

* @param root TreeNode类 the root

* @return bool布尔型一维数组

*/

/**

* 假设一个二叉搜索树具有如下特征:

*

* 节点的左子树只包含小于当前节点的数。

* 节点的右子树只包含大于当前节点的数。

* 所有左子树和右子树自身必须也是二叉搜索树。

*       2

*.   1.    3

* 是二叉搜索树

*       1

*    2     3

* 非二叉搜索树

*

*思路:中序遍历的结果是从小到大排列,故采用中序遍历,对节点值进行比较,如果出现当前节点值小于前一个节点值则不是二叉搜索树。

*/

//是否是二叉搜索树

boolean isBstTreeFlg = true;

//上一个节点值

int preNodeVal = Integer.MIN_VALUE;

public boolean[] judgeIt (TreeNode root) {

boolean[] result = new boolean[2];

if(root == null){

result[0] = true;

result[1] = true;

return result;

}

isBstTree(root);

result[0] = isBstTreeFlg;

result[1] = isCompleteTree(root);

return result;

}

//中序遍历

public void isBstTree(TreeNode root){

if(root == null || !isBstTreeFlg){

return;

}

isBstTree(root.left);

if(root.val > preNodeVal){

preNodeVal = root.val;

}else{

//中序遍历 如:2 1 3 2节点 

isBstTreeFlg = false;

return;

}

isBstTree(root.right);

}

public boolean isCompleteTree(TreeNode root){

if(root == null){

return false;

}

// 1. 先对树进行层序遍历

// 如果这个标记为 false, 说明还是处在第一阶段

// 如果这个标记为 true , 接下来的节点就不能有子树

// 也就是第二阶段开始了

int flg = 1;//第一阶段:1 第二阶段:2

LinkedList queue = new LinkedList();

queue.add(root);

while(!queue.isEmpty()){

TreeNode temp = queue.poll();

if(flg == 1){

// 合格的状态, 继续往下遍历.

// 就把左右子树加入队列就行了

if(temp.left != null && temp.right != null){

queue.offer(temp.left);

queue.offer(temp.right);

}else if(temp.left == null && temp.right != null){

// 这种情况铁定不是完全二叉树

return false;

}else if(temp.left != null && temp.right == null){

// 这是临界状态, 开启第二阶段

queue.offer(temp.left);

//开启第二阶段

flg = 2;

}

//else{这种情况不用判断

// 左右子树都为空, 开启第二阶段

//    flg = 2;

//}

}else{

//开启第二阶段

// 第二阶段要求节点必须没有子树. 只要子树存在, 就不是完全二叉树

if(temp.left != null || temp.right != null){

return false;

}

}

}

return true;

}

}

编辑于 2021-01-19 15:40:15

回复(0)

0

牛客是真的狗,明明两道题合成一道题,偷懒界的标杆啊

import java.util.*;

public class Solution {

private long pre = Long.MIN_VALUE;

public boolean[] judgeIt (TreeNode root) {

boolean[] res = new boolean[2];

res[0] = judgeBST(root);

res[1] = judgeCBT(root);

return res;

}

public boolean judgeBST(TreeNode root) {

if (root == null) {

return true;

}

if (!judgeBST(root.left)) {

return false;

}

if (root.val <= pre) {

return false;

}

pre = root.val;

return judgeBST(root.right);

}

public boolean judgeCBT(TreeNode root) {

if (root == null) {

return true;

}

Queue queue = new LinkedList<>();

queue.offer(root);

while (!queue.isEmpty()) {

boolean flag = false;

int n = queue.size();

for (int i = 0;i 

TreeNode node = queue.poll();

if (node.left != null || node.right != null) {

if (flag) {

return false;

}

}

if (node.left != null) {

queue.offer(node.left);

}else {

flag = true;

}

if (node.right != null) {

queue.offer(node.right);

}else {

flag = true;

}

}

}

return true;

}

}

发表于 2021-01-11 12:17:53

回复(0)

0

function judgeIt( root ) {

// write code here

//中序遍历 二叉搜索数 左子树<=当前节点<=右子树

//完全二叉树:除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置

function isSearch(root,min=-Infinity,max=Infinity){//限定每个节点的范围

if(!root) return true;

if(root.val<=min||root.val >= max) return false

return isSearch(root.left,min,root.val)&&isSearch(root.right,root.val,max)

}

function isComplete(root){

if(!root) return true;

if(!root.left&&root.right) return false

return isComplete(root.left)&&isComplete(root.right)

}

return [isSearch(root),isComplete(root)]//(这种判断完全二叉树的方法是错误的吧)怎么还能通过

}

编辑于 2021-01-08 15:21:11

回复(0)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用层次遍历的方式进行判断。具体步骤如下: 1. 对于一颗完全二叉树,如果节点i有左子树,那么节点i+1一定有左子树,如果节点i没有左子树了,那么节点i+1及以后的节点都没有左子树。 2. 对于一颗完全二叉树,如果节点i没有右子树,那么节点i+1及以后的节点都没有右子树。 3. 如果在遍历过程出现了一个节点没有左子树或者右子树,但是后续节点却有子树,那么这棵树就不是完全二叉树。 下面是Java代码实现: ```java import java.util.LinkedList; import java.util.Queue; public class CompleteBinaryTree { static class TreeNode { int val; TreeNode left; TreeNode right; public TreeNode(int val) { this.val = val; } } public static boolean isCompleteBinaryTree(TreeNode root) { if (root == null) { return true; } Queue<TreeNode> queue = new LinkedList<>(); queue.offer(root); boolean leafNode = false; while (!queue.isEmpty()) { TreeNode node = queue.poll(); // 如果出现了一个节点没有左子树或者右子树,但是后续节点却有子树,那么这棵树就不是完全二叉树 if (node.left == null && node.right != null) { return false; } // 如果此时已经出现过叶子节点,但是后续节点却有子树,那么这棵树就不是完全二叉树 if (leafNode && (node.left != null || node.right != null)) { return false; } if (node.left != null) { queue.offer(node.left); } else { // 如果此时已经出现了叶子节点,但是后续节点却没有子树,那么这棵树就不是完全二叉树 leafNode = true; } if (node.right != null) { queue.offer(node.right); } else { // 如果此时已经出现了叶子节点,但是后续节点却没有子树,那么这棵树就不是完全二叉树 leafNode = true; } } return true; } public static void main(String[] args) { // 测试用例 // 完全二叉树 // 1 // / \ // 2 3 // / \ / \ // 4 5 6 TreeNode root1 = new TreeNode(1); root1.left = new TreeNode(2); root1.right = new TreeNode(3); root1.left.left = new TreeNode(4); root1.left.right = new TreeNode(5); root1.right.left = new TreeNode(6); System.out.println(isCompleteBinaryTree(root1)); // true // 非完全二叉树 // 1 // / \ // 2 3 // / \ / \ // 4 5 6 7 TreeNode root2 = new TreeNode(1); root2.left = new TreeNode(2); root2.right = new TreeNode(3); root2.left.left = new TreeNode(4); root2.left.right = new TreeNode(5); root2.right.left = new TreeNode(6); root2.right.right = new TreeNode(7); System.out.println(isCompleteBinaryTree(root2)); // false } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值