\quad 首先是要判断一颗二叉树是否是完全二叉树,首先找出其根节点,找根节点的方法就是该点不是任何顶点的孩子。找出根节点后进行前序遍历,记录最大的索引,若该索引与顶点数相同则是完全二叉树,此时输出最后一个访问的节点即可。否则输出根节点。程序如下:
#include <bits/stdc++.h>
using namespace std;
struct TreeNode
{
int left, right;
}treeNode[100];
int str2dec(string s)
{
int res = 0;
if(s.length()==1) res = s[0]-'0';
else res = (s[0]-'0')*10+(s[1]-'0');
return res;
}
int vis[100];
int max_index = 0, last = 0;
void preOrder(int v, int index)
{
if(v==-1) return;
if(index>max_index)
{
max_index = index;
last = v;
}
preOrder(treeNode[v].left, 2*index);
preOrder(treeNode[v].right, 2*index+1);
}
int main(int argc, char const *argv[])
{
int n;
cin >> n;
for (int i = 0; i < n; ++i)
{
string l, r;
cin >> l >> r;
if(l=="-") treeNode[i].left = -1;
else treeNode[i].left = str2dec(l);
if(r=="-") treeNode[i].right = -1;
else treeNode[i].right = str2dec(r);
if(treeNode[i].left!=-1) vis[treeNode[i].left] = 1;
if(treeNode[i].right!=-1) vis[treeNode[i].right] = 1;
}
int root;
for (int i = 0; i < n; ++i)
{
if(vis[i]==0) root = i;
}
preOrder(root, 1);
if(max_index==n)
{
cout << "YES" << " " << last << endl;
}
else
{
cout << "NO" << " " << root << endl;
}
return 0;
}