1110 Complete Binary Tree (25分)[dfs]

读取那里注意可能是两位数,不能用char c,坑到了(测试点234)

1、一开始的处理和1102 Invert a Binary Tree (25分)一样,不过1102的限制是n<10,这里是n<20,所以出错了-,-

2、静态存储二叉树,没出现的数字是root

3、判断是否为完全二叉树,这里的方法是按完全二叉树的规则给结点编号index,然后根据index排序,如果是完全二叉树那么index就是从0->n-1,最后一个结点当然就是v[n-1].id

4、判断是否为完全二叉树,还可以直接找最大下标值。

递归出最⼤的下标值,完全⼆叉树⼀定把前⾯的下标充满: 最⼤的下标值 == 最⼤的节点数;
不完全⼆叉树前满⼀定有位置是空,会往后挤: 最⼤的下标值 > 最⼤的节点数~
 

5、每次不懂得,基本都可以拿深搜来解决~ 

#include
using namespace std;
struct Node{
    int id,index,left,right;
}node[25];
vector v;
int exist[25]={0};
//完全二叉树的判断,用index~
void dfs(int root,int index){
    if(node[root].left!=-1) dfs(node[root].left,index*2+1);
    v.push_back({root,index,0,0});
    if(node[root].right!=-1) dfs(node[root].right,index*2+2);
}
bool cmp(Node a,Node b){
    return a.index>n;
    int root=0;
    for(int i=0;i>a>>b;
        if(a!="-"){
            node[i].left=stoi(a);exist[stoi(a)]++;
        }else node[i].left=-1;
        if(b!="-"){
            node[i].right=stoi(b);exist[stoi(b)]++;
        }else node[i].right=-1;
    }
    for(int i=0;i

 

#include
using namespace std;
struct Node{
	int left,right;
}node[25];
int maxn=-1,ans;
void dfs(int root,int index){
	if(index>maxn){
		maxn=index;
		ans=root;
	}
	if(node[root].left!=-1) dfs(node[root].left,index*2);
	if(node[root].right!=-1) dfs(node[root].right,index*2+1);
}
int main(){
	int n,root;
	int exist[25]={0};
	cin>>n;
	for(int i=0;i>a>>b;
        if(a!="-"){
            node[i].left=stoi(a);exist[stoi(a)]++;
        }else node[i].left=-1;
        if(b!="-"){
            node[i].right=stoi(b);exist[stoi(b)]++;
        }else node[i].right=-1;
    }
    for(int i=0;i

 

你可能感兴趣的:(PAT甲级)